hibernate 之 inverse 详解

以前在刚接触hibernate时,在看到一对多、多对一双向关联映射时,对inverse属性很是纳闷,久久不能理解,现在闲着无事,看了看hibernate,总结一下:
一,我认为,inverse应当是在创建双向关联时,会起到作用,如果只建立单向的关联,没有必要设置此属性。
二,对于(双向关联的)保存来说,如果我们设置了inverse="true",省去执行update的sql语句,提高效率。
例如:
顾客:Customer
购买物品:Order
(它们是一对多的关系,且建立了双向关联关系。)

Customer customer = new Customer();
customer.setName(userName);
Order order = new Order();
order.setOrderName(orderName);
order.setCustomer(customer);
customer.getOrders().add(order);
sess.save(customer);

如果inverse="false",Hibernate的执行过程如下:
1)通过insert语句持久化Customer信息
2)通过insert语句持久化Order信息,此时的外键为空
3)通过update语句更新Order信息记录的外键
如果inverse="true",Hibernate的执行过程如下:
1)通过insert语句持久化Customer信息
2)通过insert语句持久化Order信息,此时的外键不为空
由此可见:对于“保存”操作来讲,我们设置inverse="true",可以省去update更新操作,insert时,子表中外键信息同时保存到表中。
三,对于(双向关联的)更新来说,如果我们设置了inverse="true",可以减少执行update的sql语句,提高效率。
对于同样上边的例子:

Customer customer = (Customer)session.load(Customer.class,new Long(2));
Order order = (Order)session.load(Order.class,new Long(2));
order.setName("更新名称");
order.setOrder(order);
customer.getOrder.add(order);


如果inverse="false",Hibernate的执行过程如下:
1)order.setName(updateName);
即:update order set name="更新名称" customerId=2 where id=2
2)customer.getOrder.add(order);
即:update order set customerId=2 where id=2
(这两条sql语句,实现了同样的功能,所以多执行了一条sql语句,影响了性能)
如果inverse="true",Hibernate的执行过程如下:
order.setName(updateName);
即:update order set name="更新名称" customerId=2 where id=2

由此可见:对于“更新”操作来讲,我们设置inverse="true",可以减少update更新操作。

应当注意的几点:
一)上边提到的设置inverse="true",指的都是在set中设置,比如:

<set name="orders" cascade="save-update" inverse="true">
<key colomn="customerId"/>
<one-to-many class="mypack.Order"/>
</set>

这样可以最大限度的减少要执行的update语句,提高性能。
二)以上提到的都是双向关联,我们在操作(保存或更新)时,双方一定要都建立关联。比如:
order.setOrder(order);
customer.getOrder.add(order);
不能只建立一方。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值