2012-03-20 99 views
1

使用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永遠不會嘗試增加版本並依賴數據庫來完成,然後在插入/更新後選擇更新後的值。

有誰能告訴我我的理解和實施出了什麼問題嗎?

回答

0

我沒有你的實際問題的答案,但我確實有你的問題的解決方案。 :)

在Hibernate中,它是完全有效的做到這一點:

@Version 
@Temporal(TemporalType.TIMESTAMP) 
@Column(name = "UPDATE_TIMESTAMP" 
private Date updateDate; 

這會讓你的更新日期的版本了。這既是精簡的,也是爲實體上的每一次合併自動更新它。順便說一下:我建議讓會員私人並將get ters和set ters添加到課程中。

+0

哦,我多麼希望你解決了我的問題,但可悲的是。這與'@ Version'和'@ Generated'具有相同的行爲。它會始終嘗試增加刷新之前的版本並導致樂觀鎖定異常。我只想讓hibernate不嘗試增加標記爲「@ Generated」的字段總是......不知道這是否是Oracle特定的問題,但我完全被困住了。 – Ben 2012-04-30 16:53:03

+0

這確實很奇怪:這段代碼已經在我們的生產環境中運行了幾個月,沒有任何問題。我很抱歉,我無法幫助你,我真的認爲它會解決你的問題... – LeChe 2012-05-11 19:10:44