2011-04-21 53 views
0

我正在試圖使用jpa.AM得到以下錯誤問題使用JPA

NestedThrowables: 
<openjpa-1.2.2-SNAPSHOT-r422266:778978M-OPENJPA-975 nonfatal store error> org.apache.openjpa.persistence.OptimisticLockException: An optimistic lock violation was detected when flushing object instance "org.apache.openjpa.enhance.com$ibm$cloud$bss$client$db$data$Offeringattribute$pcsubclass-com.ibm.cloud.bss.client.db.data.Offeringattribute-10013800" to the data store. This indicates that the object was concurrently modified in another transaction. 

現在我已經通過插入一些沖水聲明如下所示

解決了這個錯誤最後一次持續對象以下錯誤更新對象
em.persist(xyz); 
em.flush(); //added this line 
dbAttr.setOid((xyz.getId()); 
em.merge((xyz); 

但我不記得是否我上次做了其他事情。甚至在添加了這個flush語句之後,仍然收到這個錯誤。

注:運行我的應用程序作爲standalong控制檯應用程序,並深信,只有1個線程在運行

+0

在openJPA中,我從未設法在同一個實體上執行2次操作。嘗試 2015-09-05 20:28:14

回答

0

樂觀鎖異常發生,如果您嘗試更新這是由某人/別的東西,因爲你加載更新記錄它。這不需要多線程發生。

您應該能夠解決問題,在修改和保存之前重新加載實體。

----更新來回答這個問題---

做這將是關閉會話,使用負載或獲取,並確保你沒有更改版本屬性的安全方式(假設你有這樣的事情)

通常這不是你想要做的,而且如果你只在線程中工作,那麼你在會話中的實體應該是最新的。所以也許只是在合併時不要更改版本就足夠了:從會話中加載或獲取實體,將版本存儲在變量中,執行合併,重置版本以及刷新/提交可能工作。

如果不是,我需要更多的信息,關於你實際在做什麼。

+0

我該如何重新載入它? – dojoX 2011-04-21 12:12:24

1

您正在啓用子類化並且存在一些已知問題。首先,請閱讀關於enhancing your entities的頁面。它不應該超過幾分鐘,從長遠來看,你會成爲一個更快樂的露營者。該鏈接的網絡是,您需要設置以下屬性並使用另一種增強方法。

<openjpa.RuntimeUnenhancedClasses=unsupported/> 

如果這不能讓你去,你需要發佈你的實體更多的線索,以瞭解發生了什麼。

-Rick