2012-03-20 56 views
0

我有一個JPA實體人有一個@Version長版本字段。我做到以下幾點:版本沒有更新bean後繼續

<<transaction - begin>> 
person.getId() --> == NULL 
person.setVersion(1); 
em.persist(person); 
person.getId() --> returns 1 (this one is generated inside the persist call) 
person.getVersion(); --> returns 1 
<<transaction - end>> 

現在,如果我檢查DB,版本= 2,但豆錯誤地包含1

我看到了人實體的ID獲取該人的實例正確反映。但是,在調用persist()之前,該版本仍然是一個版本。爲什麼?

+0

爲什麼你指望一個版本提交之前更新?該規範不作出承諾IIRC – DataNucleus 2012-03-20 13:31:20

+0

@DataNucleus - 我想發送這個版本到視圖層,以便下一個實體更新不會產生OptimisticLockingException – 2012-03-20 14:00:32

+0

嘗試了flush()?只是不能保證立即去DB,而且DataNucleus JPA可以在flush之後提供版本,但不會在之前提供。檢查你的JPA impl文檔 – DataNucleus 2012-03-20 14:23:18

回答

1

也許你是「外面」的規範邊界:

實體可以訪問它的版本科幻場或財產或 國家出口使用的方法,通過應用程序訪問的版本,但 絕不修改版本值。只有持久性提供程序是 才允許設置或更新 對象中版本屬性的值。

(引自JPA specification

+0

謝謝你的回答,馬特!我只是爲了這個例子而設置了這個版本,但問題是我在調用persist之後永遠不會獲得這個字段的「新值」。有可能這樣做嗎? – 2012-03-20 12:47:18

+0

您可以在保留後嘗試'em.refresh()',但我不確定它是否有幫助。 – 2012-03-20 12:54:24

+0

謝謝,但它似乎沒有做任何事情。 – 2012-03-20 13:01:32