2009-06-03 36 views
6

Hibernate JavaDoc指出Session.update(Object o)會引發異常,如果已經有一個持久實例o,對吧?休眠是*不*拋出異常(我認爲應該)

If there is a persistent instance with the same identifier, an exception is thrown.

但是,當我運行它時,下面的代碼不會拋出任何東西。我認爲它應該!

Email email = new Email("andre", "girafa", "hi"); 

Session session = factory.openSession(); 
Transaction tx = session.beginTransaction(); 

session.save(email); 
session.update(email); 
session.update(email); 

tx.commit(); 

// didn't throw... Let's try again 

tx = session.beginTransaction(); 

session.update(email); 
session.update(email); 

tx.commit(); 
session.close(); 

// still nothing! :(

正如你可以說,兩次我嘗試做多update() S,但仍Hibernate的對我採取容易。

有人有預感嗎?

編輯:它似乎只會用相同的ID作爲email扔如果另一個等價的對象,例如,email2。我猜那裏的文檔有點sl py。

+0

是的!文檔永遠不想寫清楚,它引導我到這個問題! – GMsoF 2017-05-20 02:58:29

回答

8

Hibernate中的更新不是SQL語言中的更新。 Hibernate通過Session對象中的狀態緩存自動處理SQL UPDATE

但它只適用於在當前會話中加載的實體。此方法,session.update(對象)是用於將對象從另一層附加到當前會話以跟蹤和可能在最後更新。

在你的情況下,它只是一個NOOP。它會酸酸地拋出,如果:

Email email = new Email("andre", "girafa", "hi"); 

Session session = factory.openSession(); 
Transaction tx = session.beginTransaction(); 

int id = session.save(email); 
Email anotherEmail = new Email("", "", ""); 
anotherEmail.id = id; 

session.update(anotherEmail); // will throw 

你可以閱讀更多關於更新方法語義上Hibernate reference

+0

這是一個更好的解決方案,具有明確的例子! – GMsoF 2017-05-20 02:55:51

0

你可以試一下session.flush()嗎?要查看是否引發異常(有時提交可能不會刷新數據,具體取決於刷新模式)。

儘管我會說只有當對象在當前會話的範圍之外更新時,纔會拋出異常,我們可以說併發客戶端。

6

沒有錯誤,因爲它與您正在更新的實例相同。

如果會話中存在不同的持久實例並嘗試更新(),則會引發該錯誤。

+0

每次都得到它們 – 2009-06-03 21:13:21