入门 15 - Component的集合映像
先前所介绍的集合映像都只使用了String属性表示一个数据库字段的内容,在之前的一个主题中我们看过,我们可以将一个字段的内容映像至一个Component对象:
入门 10 - Component 映射
如果我们想要将Component对象储存至集合对象中,例如将Email对象储存至HashSet中,在映像时只需要将<element> 标签改为<composite-element>,并指定映像的类别,举个实际的例子来说好了,我们撰写以下的User类别,它的addrs 是HashSet,当中将储存Email对象:
User.java
package onlyfun.caterpillar;
import java.util.HashSet;
import java.util.Set;
public class User {
private long id;
private String name;
private Set addrs = new HashSet();
public Set getAddrs() {
return addrs;
}
public void setAddrs(Set addrs) {
this.addrs = addrs;
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void addAddress(Email addr) {
addrs.add(addr);
}
}
我们的Email类别如下:
Email.java
package onlyfun.caterpillar;
public class Email {
private String address;
public void setAddress(String address) {
this.address = address;
}
public String getAddress() {
return address;
}
public void sendMail() {
System.out.println("send mail to: " + address);
}
}
要映射这两个类别,映射文件撰写如下:
User.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping
PUBLIC "-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<class name="onlyfun.caterpillar.User" table="USER">
<id name="id" type="long" unsaved-value="null">
<column name="USER_ID"/>
<generator class="increment"/>
</id>
<property name="name" type="string" not-null="true">
<column name="NAME" length="16" not-null="true"/>
</property>
<set name="addrs" table="ADDRS">
<key column="USER_ID"/>
<composite-element class="onlyfun.caterpillar.Email">
<property name="address" column="ADDRESS" not-null="true"/>
</composite-element>
</set>
</class>
</hibernate-mapping>
您可以看到,实际上我们数据库中的表格字段是不变的,同样是USER与ADDRS两个表格,Hibernate所作的工作是在储存数据或取出数据时,根据映像文件将ADDRS中的数据填入Email对象或取出。
类似的,您也可以使用Map对象来储存Component,而映像文件中的<map>可以这么撰写:
<map name="files" table="FILES">
<key column="USER_ID"/>
<index column="DESCRIPTION" type="string"/>
<composite-element class="onlyfun.caterpillar.Files">
<property name="file" column="FILENAME" not-null=true/>
<property name="other" column="OTHER" not-null="true"/>
</composite-element>
</map>