Hibernate对象关联的维护

来源:互联网 发布:windows bash 下载 编辑:程序博客网 时间:2024/05/16 15:16

级联措施:
<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:

@Testpublic 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);



 



 

原创粉丝点击