Hibernate集合映射
<set>,<list>,<map>,<bag>,<array>,<primitive-array>
集合映射-Set
先介绍当Set中包括的对象为非实体(Entity)时的映射方式,简单的说,也就是所包括的对象没有对象识别(Identity),只是纯粹的值型态(Value type)对象)。
假设您有一个User类别,当中除了名称属性之外,另一个就是使用者的电子邮件地址,同一个使用者可能有多个不同的邮件地址,所以在User类别中使用 Set对象来加以记录,在这边使用String来记录每一笔邮件地址,为了不允许重复的邮件地址记录,所以使用Set对象,User类别如下:
public class User {
private Integer id;
private String name;
private Set emails;
// 必须要有一个预设的建构方法
// 以使得Hibernate可以使用Constructor.newInstance()建立对象
public User() {}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set getEmails() {
return emails;
}
public void setEmails(Set emails) {
this.emails = emails;
}
public void addEmail(String email) {
this.emails.add(email);
}
public void removeEmail(String email) {
this.emails.remove(email);
}
}
要映像Set容器,您可以使用另一个表格来储存Set容器中的数据,例如您可以分别建立user与email表格:
CREATE TABLE user (
id INT(11) NOT NULL auto_increment PRIMARY KEY,
name VARCHAR(100) NOT NULL default ''
);
CREATE TABLE email (
id INT(11) NOT NULL,
address VARCHAR(100) NOT NULL
);
接着定义映像文件,使用<set>标签来定义Set映像:
User.hbm.xml
<hibernate-mapping>
<class name=“com.cstp.User" table="user">
<id name="id" column="id" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="name" column="name" type="java.lang.String"/>
<set name="emails" table="email">
<key column="id"/>
<element type="java.lang.String"
column="address"/>
</set>
</class>
</hibernate-mapping>
假设您如下储存对象:
User user1 = new User();
user1.setEmails(new HashSet());
user1.setName(“hhp");
user1.addEmail(“hhp@gmail.com");
user1.addEmail(“hhp@yahoo.com");
User user2 = new User();
user2.setEmails(new HashSet());
user2.setName(“tiantian");
user2.addEmail(“tian@gmail.com");
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.save(user1);
session.save(user2);
tx.commit();
session.close();
集合映射-List
List是有序的结构,所以在储存List容器中的对象时,要一并储存其顺序信息,例如若您设计了以下的类别:
User.java
public class User {
private Integer id;
private String name;
private List items;
// 必须要有一个预设的建构方法
// 以使得Hibernate可以使用Constructor.newInstance()建立对象
public User() {}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List getItems() {
return items;
}
public void setItems(List items) {
this.items = items;
}
public void addItem(String item) {
items.add(item);
}
public void removeItem(String item) {
items.remove(item);
}
}
在设计表格时,使用一个item表格来记录List容器信息,item表格必须包括索引信息,例如您可以如下建立user与item表格:
CREATE TABLE user (
id INT(11) NOT NULL auto_increment PRIMARY KEY,
name VARCHAR(100) NOT NULL default ''
);
CREATE TABLE item (
id INT(11) NOT NULL,
position INT(11) NOT NULL,
name VARCHAR(100) NOT NULL default ''
);
其中position字段要用来储存List的索引信息,可以使用<list>标签如下定义映像文件:
User.hbm.xml
<hibernate-mapping>
<class name=“hhp.com.User" table="user">
<id name="id" column="id" type="java.lang.Integer">
<generator class="native"/>
</id>
<property name="name" column="name" type="java.lang.String"/>
<list name="items" table="item">
<key column="id"/>
<index column="position"/>
<element type="java.lang.String" column="name"/>
</list>
</class>
</hibernate-mapping>
假设您如下储存对象:
User user1 = new User();
user1.setItems(new ArrayList());
user1.setName(“hhp");
user1.addItem("DC");
user1.addItem("CF Card");
User user2 = new User();
user2.setItems(new ArrayList());
user2.setName(“tiantian");
user2.addItem("comics");
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
session.save(user1);
session.save(user2);
tx.commit();
session.close();
集合映射-Map
Map的特性是key/value对,容器中的每一个对象都有一个key与之对应,所以将Map容器的数据储存至数据库时,必须一同储存它的key信息。
假设您设计了以下的类别: User.java
import java.util.Map;
public class User {
private Integer id;
private String name;
private Map items;
// 必须要有一个预设的建构方法
// 以使得Hibernate可以使用Constructor.newInstance()建立对象
public User() {}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Map getItems() {
return items;
}
public void setItems(Map items) {
this.items = items;
}
public void addItem(String name, String description) {
items.put(name, description);
}
public void removeItem(String name) {
items.remove(name);
}
}
您可以建立以下的表格来分别储存user信息与当中的items信息:
CREATE TABLE user (
id INT(11) NOT NULL auto_increment PRIMARY KEY,
name VARCHAR(100) NOT NULL default ''
);
CREATE TABLE item (
id INT(11) NOT NULL,
name VARCHAR(100) NOT NULL default '',