Hibernate对象关联的维护


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



 



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值