级联措施:
<hibernate-mapping package="com.zxf.domain">
<class name="Employee">
<id name="id">
<generator class="identity"></generator>
</id>
<property name="name" not-null="true"/>
<many-to-one name="department" column="dep_id" class="Department" cascade="save-update"></many-to-one>
</class>
</hibernate-mapping>
或者另一端维护:上下中cascade只需一个指定就可以了,多个可以这样cascade="delete,save-update"
<class name="Department">
<id name="id" column="dep_id">
<generator class="identity"></generator>
</id>
<property name="name" not-null="true"/>
<set name="employees" cascade="save-update">
<key column="dep_id"></key>
<one-to-many class="Employee"/>
</set>
</class>
inverse属性决定是否放弃维护关联关系:true表示放弃
<hibernate-mapping package="com.zxf.domain">
<class name="Department">
<id name="id" column="dep_id">
<generator class="identity"></generator>
</id>
<property name="name" not-null="true"/>
<set name="employees" inverse="true">
<key column="dep_id"></key>
<one-to-many class="Employee"/>
</set>
</class>
</hibernate-mapping>
Junit:
@Test
public void testSave(){
Employee e1 = new Employee();
Employee e2 = new Employee();
Department dep = new Department();
Set<Employee> es = new HashSet<Employee>();
e1.setName("Jason");
e2.setName("Teeny");
dep.setName("HR");
es.add(e1);
es.add(e2);
e1.setDepartment(dep);//
e2.setDepartment(dep);
dep.setEmployees(es);//
Session session = null;
session = HibernateUtil.getSession();
session.beginTransaction();
session.save(dep);
session.save(e1);
session.save(e2);
session.getTransaction().commit();
session.close();
}
两者的区别:
级联映射:用这个对象关联只要指定一端,比如说Department.hbm.xml指定后,持久化对象的时候只需要指定Department对象里面有哪些Employee就不需要在Employee对象里面指定它是哪个Department了,也就是只要:
//e1.setDepartment(dep);
//e2.setDepartment(dep);
dep.setEmployees(es);
inverse:可以在对象模型中将关联指定清楚,但是不需要在one-to-many的one端维护这种关联,所以放弃对one端的维护,为了提高性能,可以让one端先save,可以减少update语句:
e1.setDepartment(dep);//
e2.setDepartment(dep);
dep.setEmployees(es);//
这两个是相互联系的,即使one端inverse="true",如果没有指定cascade,那么想要通过下面的方式将某一部门内所有Employee也持久化到数据库是不可能的:
session.save(dep);
//session.save(e1);
//session.save(e2);