给定一个Hibernate域对象,有什么方法可以确定它是否是实时的(即存在于数据库中)而不是搜索它? la HIbernate.isObjectLive(domainObj)
或domainObj.amIAlive()
有哪些方法可能更有效吗?
我对Hibernate比较陌生。如果答案是“不”,那我就好了。提前谢谢。
答案 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)。