一对多规则:比如Department和Employee,一个Department对应多个Employee,称为一对多;
一对多的规则:
public class Department { private int id; private String name; private Set<Employee> emps; //此为一对多 getter setter... }
public class Employee { private int id; private String name; getter setter... }
在Department.hbm.xml中设置:
<set name="emps"> <key column="depart_id"></key> <!-- 因为集合属性不可能存储在这张表中,需要另开一张表,所以需要指定存储此集合的表用于连接department表的id属性的外键 --> <!-- depart_id为Employee表中需要和Department表的id相关联的属性 --> <one-to-many class="Employee"/><!-- 指定一对多对应的表 --> </set>
一对多规则设置以后,在Department中是没有任何变化的,变化是在Employee中多出了一个depart_id属性;
多对一规则:
public class Department { private int id; private String name; getter setter... }
package org.xiazdong; public class Employee { private int id; private Department depart; //此为多对一,通过Department对象引用Department private String name; getter setter... }
Employee.hbm.xml中设置:
<many-to-one name="depart" column="depart_id" /> <!-- 设置在Employee中有一个depart_id和Department的主键相关联-->
实例:
Employee.java
package org.xiazdong; public class Employee { private int id; private Department depart; //此为多对一 private String name; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Department getDepart() { return depart; } public void setDepart(Department depart) { this.depart = depart; } }
Department.java
package org.xiazdong; import java.util.Set; public class Department { private int id; private String name; private Set<Employee> emps; //此为一对多 public Set<Employee> getEmps() { return emps; } public void setEmps(Set<Employee> emps) { this.emps = emps; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
Employee.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2012-5-17 10:59:47 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping package="org.xiazdong"> <class name="Employee"> <id name="id"> <generator class="native" /> </id> <property name="name" /> <many-to-one name="depart" column="depart_id" /> </class> </hibernate-mapping>
Department.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 2012-5-17 10:59:47 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping package="org.xiazdong"> <class name="Department"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <set name="emps"> <key column="depart_id"></key> <!-- 因为集合属性不可能存储在这张表中,需要另开一张表,所以需要指定存储此集合的表用于连接department表的id属性的外键 --> <!-- depart_id为Employee表的主键,和Department表的id相关联 --> <one-to-many class="Employee"/><!-- 指定一对多对应的表 --> </set> </class> </hibernate-mapping>
执行后表为:
Department
Employee
测试类:
package test; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.util.HibernateUtil; import org.xiazdong.Department; import org.xiazdong.Employee; public class Many2OneTest { public static void main(String[] args) { add(); query(); } static void query(){ Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); Department depart = (Department) session.get(Department.class, 6); Employee e = (Employee) session.get(Employee.class, 8); System.out.println(depart.getEmps()); System.out.println(e.getDepart().getName()); tx.commit(); session.close(); } static void add(){ Department depart = new Department(); depart.setName("depart"); Employee e1 = new Employee(); e1.setName("e1"); e1.setDepart(depart); Employee e2 = new Employee(); e2.setName("e2"); e2.setDepart(depart); Session session = HibernateUtil.getSession(); Transaction tx = session.beginTransaction(); session.save(depart); session.save(e1); session.save(e2); tx.commit(); session.close(); } }