给定一个 Hibernate 域对象,除了搜索它之外,有什么方法可以确定它是否存在(即存在于数据库中)?有什么方法可以使用HIbernate.isObjectLive(domainObj)
或者domainObj.amIAlive()
可能更有效吗?
我对 Hibernate 比较陌生。如果“否”是答案,我可以接受。提前致谢。
给定一个 Hibernate 域对象,除了搜索它之外,有什么方法可以确定它是否存在(即存在于数据库中)?有什么方法可以使用HIbernate.isObjectLive(domainObj)
或者domainObj.amIAlive()
可能更有效吗?
我对 Hibernate 比较陌生。如果“否”是答案,我可以接受。提前致谢。
Hibernate 只能通过检查数据库来知道一个对象是否根据该定义是“活动的”。你应该用Session.get(object.getClass(), object.getId())
看看是不是这样。如果对象不再存在于数据库中,它将返回 null。
请注意,它Session
有一个缓存,因此如果对象已经在该缓存中,但同时已从数据库中删除,Session.get(...)
则将返回一个引用。出于这个原因,您可能希望Session
在进行检查之前获得一个新的。
我认为最有效的方法是:
select o.id from Entity o where o.id=?
. 如果这返回空结果,那么那里没有对象。
另一种选择(可能这在并发环境中更可取)是使用乐观锁定,以便对象具有存储在数据库中的版本,并且在保存它时,它将执行以下操作:update Entity set ... where id = ? and version = ?
. 如果对象已经过时(更新或删除),它将抛出异常。
但是 session.get() 也可以工作,如果对象应该在会话级缓存中,你只需要在调用之前调用 session.evict(object) 。