是否有一些很好的方法来确定Hibernate对象是否是" live"?

时间:2012-04-24 02:29:02

标签: hibernate

给定一个Hibernate域对象,有什么方法可以确定它是否是实时的(即存在于数据库中)而不是搜索它? la HIbernate.isObjectLive(domainObj)domainObj.amIAlive()有哪些方法可能更有效吗?

我对Hibernate比较陌生。如果答案是“不”,那我就好了。提前谢谢。

2 个答案:

答案 0 :(得分:3)

Hibernate只知道某个对象是否是“直播”。通过检查数据库的定义。您应该使用Session.get(object.getClass(), object.getId())来查看是否属于这种情况。如果数据库中不再存在该对象,它将返回null。

请注意Session有一个缓存,因此如果该对象已经在该缓存中,但同时已从数据库中删除,Session.get(...)将返回一个引用。因此,您可能希望在进行检查之前获得新的Session

答案 1 :(得分:0)

我认为最有效的方法是: select o.id from Entity o where o.id=?。如果返回空结果,则那里没有对象。

另一个选项(并且可能在并发env中更可取)是使用乐观锁定,以便对象具有存储在数据库中的版本,并在保存时,它将执行以下操作:update Entity set ... where id = ? and version = ?。如果对象已经过时(更新或删除),它将抛出异常。

但是session.get()也可以工作,如果希望对象在会话级缓存中,你只需要在执行之前调用session.evict(object)。