hibernate 的级联保存和关联关系

转自:http://joezheng123.javaeye.com/blog/346877

 

当Hibernate持久化一个临时对象时,在默认情下,他不会自动持久化所关联的其他临时对象,如果希望当持久化对象时把他所关联的所有临时对象进行持久化的话:可以把 的cascade属性设置为"save-update" ,cascade的默认属性值为none。
cascade:设置操作对象时的级联操作,即层级之间的连锁操作
值 save-update :表示当保存和更新当前对象(即insert和update语句时),会级联保存和更新与他关联的对象
值 all :表示任何情况下都会进行级联操作,即对一个对象进行操作,也会对和他关联的其他对象进行同样的操作
值 delete :表示在执行delete时,进行级联操作,删除和他关联的对象
值 none :表示任何情况下,都不会进行级联操作

 

以下为实例代码:

Customer 和 Orders 是一对多的关系,Orders和Customer是多对一关系,即这两个双向关联.

Customer 和Bid是一对一的关系,一对一的关系就不存在双向和单向了

 

如下是他们的类:

customer.java

 

orders.java

 

Bid.java

 

customer.hbm.xml

 

 

orders.hbm.xml

 

bid.hbm.xml

 

 

test.java

 

 

 

说明:a,b,c为级联的步骤

a.在set属性上加 cascade="save-update"

b. 关联类 见代码test.java的注释

c. 保存customer一个就行了,因为customer表是主表,orders表的外键customerOId和Bid表的外键customerBId     都关系到 customer表的主键;


注意:

a.一般都选择保存customer来级联保存orders和bids,不选择保存orders或者bids来级联保存customer;

b. 没有.inverse="true",执行如下语句

insert into customer (name, orderDate, telephone, customerId) values (?, ?, ?, ?)
Hibernate: insert into orders (name, customerOId, orderId2) values (?, ?, ?)
Hibernate: insert into orders (name, customerOId, orderId2) values (?, ?, ?)
Hibernate: insert into bid (name, customerBId, bidId) values (?, ?, ?)
Hibernate: update orders set customerOId=? where orderId2=?
Hibernate: update orders set customerOId=? where orderId2=?

有了inverse="true",执行如下语句
insert into customer (name, orderDate, telephone, customerId) values (?, ?, ?, ?)
Hibernate: insert into orders (name, customerOId, orderId2) values (?, ?, ?)
Hibernate: insert into orders (name, customerOId, orderId2) values (?, ?, ?)
Hibernate: insert into bid (name, customerBId, bidId) values (?, ?, ?)
可以看出减少了2条语句,提高了性能

 

customer单向关联orders的步骤:

1.

customer.hbm.xml

2.orders.hbm.xml 不用配关联到customer, 删除 <many-to-one >元素

3.orders类的customer属性删除

4.只需单向关联

Customer c = new Customer();

 Bid bid = new Bid();
c.setBidId(bid);

5.save(c) 就行了

注意:

如果是customer单向关联orders,那么inverse="true" 不可以少,否则orders表的外键为null,它需要

Hibernate: update orders set customerOId=? where orderId2=?
Hibernate: update orders set customerOId=? where orderId2=?

这两句来更新orders表的外键

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值