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列中。