2012-04-24 24 views
1

給定一個Hibernate域對象,有什麼方法可以確定它是否存在(即存在於數據庫中),而不是搜索它?有沒有一些方法可以更有效?HIbernate.isObjectLive(domainObj)domainObj.amIAlive()有沒有一些漂亮的方法來確定一個Hibernate對象是否是「活的」?

我對Hibernate比較新。如果「不」是答案,我可以。提前致謝。

+0

檢查其ID域是不夠的?我的意思是,如果它不是活的,它通常沒有ID ... – Spidey 2012-04-24 02:32:28

+0

我應該澄清:我以前從數據庫中檢索到'domainObj',所以它會有一個ID。 – 2012-04-24 02:33:04

+0

所以你想知道在多線程場景中對象是否仍然存在? – Spidey 2012-04-24 02:34:17

回答

3

Hibernate只會通過檢查數據庫來知道該對象是否是「活」的。您應該使用Session.get(object.getClass(), object.getId())來查看是否屬於這種情況。如果對象不再存在於數據庫中,它將返回null。

請注意,Session有一個緩存,因此如果該對象已在該緩存中,但同時已從數據庫中刪除,則Session.get(...)將返回一個引用。出於這個原因,您可能希望在做檢查之前獲得新的Session

0

我認爲最有效的方法是: select o.id from Entity o where o.id=?。如果這返回空結果,那麼在那裏沒有對象。

另一種選擇(也許這是在併發環境中最好)是使用樂觀鎖定,以便該對象有一個版本存儲在數據庫中,並保存它時,它會做這樣的事情:update Entity set ... where id = ? and version = ?。如果對象已經陳舊(更新或刪除),它將引發異常。

但是session.get()也可以工作,如果對象需要在會話級別緩存中,您只需在執行前調用session.evict(object)即可。

相關問題