使用Hibernate 4.1.0提供的Spring 3.1/JPA 2。Hibernate/JPA @Version和@Generated導致StaleObjectStateException
我對我所有的實體,它提供基本的審計能力(更新時間戳,版本號等),因爲其他應用程序訪問我們的數據庫,這些必須通過觸發器設置的基類。
我的映射是這樣的:
public abstract class AbstractBaseModel implements Serializable {
@Version
@Generated(GenerationTime.ALWAYS)
@Column(name = "VERSION", insertable = false, updatable = false)
protected Long version;
@Generated(GenerationTime.ALWAYS)
@Column(name = "UPDATE_TIMESTAMP", insertable = false, updatable = false)
protected Date updateDate;
...
}
的org.hibernate.engine.internal.increment(...)
方法提交事務時總是叫 - 在一個StaleObjectStateException
結果。
奇怪的是,如果我上的版本列設置GenerationTime.NEVER
,休眠還是遞增的版本,但仍然存在正常。問題是,即使數據庫中的版本沒有得到更新(例如,表中沒有更改),從合併返回的版本也會比數據庫值高1,這顯然會導致後續保存時出現問題。
我的期望是GenerationTime.ALWAYS
會告訴hibernate永遠不會嘗試增加版本並依賴數據庫來完成,然後在插入/更新後選擇更新後的值。
有誰能告訴我我的理解和實施出了什麼問題嗎?
哦,我多麼希望你解決了我的問題,但可悲的是。這與'@ Version'和'@ Generated'具有相同的行爲。它會始終嘗試增加刷新之前的版本並導致樂觀鎖定異常。我只想讓hibernate不嘗試增加標記爲「@ Generated」的字段總是......不知道這是否是Oracle特定的問題,但我完全被困住了。 – Ben 2012-04-30 16:53:03
這確實很奇怪:這段代碼已經在我們的生產環境中運行了幾個月,沒有任何問題。我很抱歉,我無法幫助你,我真的認爲它會解決你的問題... – LeChe 2012-05-11 19:10:44