2010-11-05 71 views
1

我使用Spring 3.0.4-RELEASE,JPA 2.0與Hibernate作爲提供程序,JTA JOTM用於我的應用程序中的事務。我已經在我的實體對象調用entityManager.merge時收到以下錯誤:org.springframework.transaction.UnexpectedRollbackException for null @Version列

org.objectweb.jotm.SubCoordinator commit_one_phase 
INFO: Rollback during beforeCompletion in SubCoordinator.commit_one_phase 
org.springframework.transaction.UnexpectedRollbackException: JTA transaction unexpectedly rolled back (maybe due to a timeout); nested exception is javax.transaction.RollbackException 
     at 
org.springframework.transaction.jta.JtaTransactionManager.doCommit(JtaTransactionManager.java:1012)  

此錯誤之際,將數據直接寫入數據庫(MySQL的)通過我們的了Talend ETL作業的結果。我注意到我的數據庫中的@Version列有NULL值,並決定將它們設置爲0,這解決了問題。

爲什麼不能@Version列是NULL?有其他人遇到過這個問題嗎?謝謝。

回答

0

你期望什麼行爲?

在分離對象上執行merge時,如果分離實體的版本與數據庫中的版本不匹配,則會引發樂觀併發異常。我想在你的情況下,這個例外是UnexpectedRollbackException。如果分離實體的版本爲0,則將數據庫中的版本列設置爲0即可解決此問題。

真正的解決方案是當外部軟件改變它時,增加數據庫中實體的版本。這與樂觀鎖定策略是一致的。

1

我的實體對象調用entityManager.merge當我收到以下錯誤

如果你想完全瞭解這裏發生了什麼,激活日誌記錄,看看究竟是什麼導致了RollbackException (我懷疑「壞」SQL)。

請注意,您沒有得到OptimisticLockException,我認爲Hibernate在某種程度上被NULL版本弄糊塗了。我沒有真正解決這個問題,也不能詳細解釋它,但看起來Hibernate甚至沒有爲合併生成預期的UPDATE聲明。

爲什麼不能將@Version列設置爲NULL?有其他人遇到過這個問題嗎?謝謝。

正如我寫的,我不能給出確切的原因,但我很想回答:因爲這不是Hibernate期望的值。 Hibernate將以0作爲版本列的初始值開始,我的建議是尊重Hibernate的期望並將其設置爲默認值。

如果您想了解爲什麼將NULL設置爲初始值會導致麻煩,您必須調試Hibernate的代碼。但說實話,這聽起來像是在浪費時間:因爲你使用的是Hibernate,所以在繞過Hibernate的API時,只要尊重/模仿Hibernate的行爲。

相關問題