4.1.5 对象身份标识范围之外

如果一个对象引用离开了对象身份的范围,那么我们称这个引用指向了一个detached对象。为了这个概念如此有用呢?

在web程序中,通常在用户交互中你不需要维护一个数据库事务。用户可能需要花费很长时间去做修改方面的事情,但是由于性能方面的原因,你必须保证数据库事务不能占用太长时间并且尽快释放数据库资源。在这个环境中,重用一个指向detached实例的应用就变得很有意义。例如,你可能想要发送一个从表现层取得的一个对象,当用户修改之后,你再继续重新使用它。

出于性能上的考虑,你可能并不想要取得整个对象图,因此重用detached对象就变得很重要。Hibernate支持重新选择detached实例。这就意味着Hibernate可以通过当前的Session取得一个detached实例。一旦一个detached对象重新和Session发生了关联,它就仍然被认为是一个持久化实例,在事务的结尾它的状态将和数据库保持同步。

这种重新关联可能会造成在数据库中添加新的一行的效果。例如,一个new的Bid对象被加入到一个detached的Item对象中。Hibernate能够检测到Bid需要被插入到数据库。为了做到这些,Hibernate必须能够区分能够区分一个新的tranisent对象以及一个旧的detached对象。Transient对象需要被保存,而detached对象需要被重新关联。有几种方法可以来区分transient和detached实例,但是最好的办法就是查看标识符属性。Hibernate能够检测一个transient或者detached对象的标识符来正确对待不同状态的对象。我们将在4.3.4中讨论这些。

如果你愿意利用Hibernate重新关联detached对象的特性的话,那么你需要注意到Hibernate对象身份范围的特点,那就是在Session范围内保持一致的对象。一旦你离开了Session的范围,那么对象就会变成detached状态,这就会引出另外一个有趣的概念。

我们需要讨论Java对象的相等以及数据库标识的关系。作为一个类的开发人员,你需要认识到Java中的相等性是由equals()以及hasCode()方法来控制的。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值