Hibernate 集合类型使用

为了映射实体中的集合属性,Hibernate提供了set, list, array, bag, map类型。

1. set
经常使用,实体对象不重复,没有顺序。对应实体类中的java.util.Set类型。

2. list
可以记录实体插入数据库的顺序。对应实体类中的java.util.List类型。

修改Department类:
	private List<Employee> employees;
	// Getters and setters are omitted


修改Department.hbm.xml:
<class name="Department">
	<list name="employees" lazy="true">
		<key column="depart_id" not-null="true"/>
		<list-index column="em_order"/>
		<one-to-many class="Employee"/>
	</list>
</class>

key指定employee表中的外键名。
list-index指定employee表中记录插入次序的字段。

Hibernate启动后,会生成下面的employee表:
id name depart_id em_order


3. bag
和list类似,也是对应实体类中的java.util.List类。不同的是没有记录记录插入的顺序。

修改Department类:
和2相同。

修改Department.hbm.xml
<class name="Department">
	<bag name="employees">
		<key column="depart_id"/>
		<one-to-many class="Employee"/>
	</bag>
</class>


生成的employee表:
id name depart_id


4. array
和list类似,可以记录插入次序。对应的是实体类中的数组。

修改Department类:
	private Employee[] employees;


修改Department.hbm.xml:
<class name="Department">
	<array name="employees" cascade="save-update">
		<key column="department_id" not-null="true"/>
		<list-index column="emp_index" base="1"/>
		<one-to-many class="Employee"/>
	</array>
</class>

base指定序号从多少开始。

5. map
不仅映射属性值,还映射属性键。所以,除了指定外键列外,还需要指定属性键列(如果没有指定,hibernate会默认生成一列)。系统将以外键列和key列作为联合主键。

修改Department类:
	private Map<String, Employee> employees;
	// Getters and setters are omitted


修改Department.hbm.xml:
<class name="Department">
	<map name="employees" cascade="save-update">
		<key column="department_id"/>
		<map-key type="java.lang.String" column="ind"/>
		<one-to-many class="Employee"/>
	</map>
</class>


在Employee类和映射文件中加入ind的声明。

测试代码:
public void testMapSave() {
	Session s = null;
	Transaction tx = null;
	
	Department depart = new Department("FDI");
	Employee em1 = new Employee("Jacy");
	Employee em2 = new Employee("Neil");
	Map<String, Employee> employees = new HashMap<String, Employee>();
	employees.put(em1.getName(), em1);
	employees.put(em2.getName(), em2);
	depart.setEmployees(employees);
	
	try {
		s = HibernateUtil.getSession();
		tx = s.beginTransaction();
		s.save(depart);
		tx.commit();
	} catch (HibernateException e) {
		if (tx != null)
			tx.rollback();
		e.printStackTrace();
	} finally {
		if (s != null)
			s.close();
	}
}


生成的employee表:
id name ind  department_id
  1 Jacy Jacy              1
  2 Neil Neil              1

在代码中指定的键就会保存到ind列中。

猜你喜欢

转载自czj4451.iteye.com/blog/1629164