2012-01-31 50 views
1

我需要使hibernate只保存未執行的對象。如果這個對象已經存在,那麼hibernate必須不做任何事情,或者對持久對象的id進行標記。源代碼equals()和hashCode()方法是owerriden並且工作正常。 我可以通過配置或類似pre插入監聽器的方式做到這一點嗎? 例如:休眠。僅保存未執行的對象

session.beginTransaction(); 
ElementToPersist element = new ElementToPersist(); 
element.setName("Element"); 
element.setValue("Value"); 

session.save(element); 
session.getTransaction().commit(); 

session.beginTransaction(); 
ElementToPersist element2 = new ElementToPersist(); 
element2.setName("Element"); 
element2.setValue("Value"); 

session.save(element2); 
session.getTransaction().commit(); 

在我的情況下,這兩個元素將與不同的ID的持久化。我怎樣才能讓hibernate在插入前檢查這個元素的存在?你能展示最好的實踐嗎? 謝謝。

回答

4

使用查詢來檢查數據庫中是否存在元素,並且僅當它不存在時才插入它。請注意,這應該通過數據庫約束來強制執行,因爲如果兩個事務同時檢查並插入相同的元素,則可能會出現爭用條件。

+0

不幸的是,由於架構異常,我無法添加約束條件。如果另一個對象與此元素具有多對一關聯,並且它必須被持久化,我該怎麼辦? – 2012-01-31 12:46:56

+0

那麼,根據具體情況,使用已存在於數據庫中的元素或剛剛保存的元素初始化ManyToOne關聯。 – 2012-01-31 12:52:10

+0

所以,你的意思是我必須執行查詢,如「session.createQuery(」從ElementTOPersist作爲o哪裏o =?「)」然後手動保存這個對象? – 2012-01-31 12:52:35