2009-09-01 71 views
1

我試着去刪除它具有像一個獨特的PK實體後添加一個類似的實體:80253刪除一個實體,但使用相同的主鍵清除

我做的代碼後續的行刪除此實體:

myEntityType1 = getEntityManager().find(MyEntityType1.class, 80253); 
getEntityManager().remove(myEntityType1); 
getEntityManager().flush(); 

這些代碼段實際上從我的數據庫及其所有級聯對象中正確刪除行,我對此非常高興。現在,當我現在需要創建一個使用相同主鍵的類似實體時(現在應該正確?),問題就會出現。

MyEntityType2 myEntityType2 = new MyEntityType2(); 
myEntityType2.copyData(myEntityType1); //access the data from the other object 
//and retrieves the id 80253. myEntityType2 now has 80253 as ID. 
getEntitymanager().persist(myEntityType2); 

現在這是我得到一個唯一約束SQL錯誤的地方。我試圖插入一個已存在的ID,並且這些更改會自動回滾(舊的實體不再被刪除)。我在記錄器中看到toplink刪除了舊實體的記錄後,會發生這種情況。

有誰知道這是怎麼發生的,爲什麼它不工作?對於記錄我試圖合併,關閉,清理entityManager,但似乎沒有任何工作。

在我看來,JPA可能會做一些不好的緩存或什麼。我希望有人對我有好的迴應! =)

更新:即使世界不再有唯一的ID限制的問題,但我創建已被刪除我得到下面的異常相同主鍵的新的子類:

Exception Description: Trying to invoke [setApprovedWhen] on the object [null]. The 
number of actual and formal parameters differs, or an unwrapping conversion has failed. 
Internal Exception: java.lang.IllegalArgumentException: object is not an instance of 
declaring class 

似乎對我來說,它不會讓我把對象變成不同的子類?

回答

2

編輯: 嘗試顯式啓動和提交事務。

刪除的實體很簡單,只要 調用EntityManager的方法 刪除(對象實體)作爲以下 示例所示。您必須管理您刪除的實體 :也就是說,它必須先前已在 持久性上下文中讀取 。

entityManager.getTransaction().begin(); 
myEntityType1 = getEntityManager().find(MyEntityType1.class, 80253); 
getEntityManager().remove(myEntityType1); 
entityManager.getTransaction().commit(); 

當交易完成後,或 調用EntityManager的flush()方法, 實體將被刪除。 在容器管理的持久性 上下文中,事務邊界 將由容器控制。

+0

在上面的代碼我除去myEntityType1這樣的: myEntityType1 = getEntityManager()找到(MyEntityType1.class,80253); getEntityManager()。remove(myEntityType1); getEntityManager()。flush(); – 2009-09-01 10:09:37

+0

在刪除reight之前複製對象? – 2009-09-01 10:13:05

+0

對象本身從不被刪除,但它不應該存在於數據庫權利?所以JPA調用INSERT INTO查詢PK不應該在數據庫中。我剛剛發現了這個tho:「就像持久和合並方法一樣,DELETE(em。刪除)聲明不一定立即發佈,但保證在某一時刻發佈「...這可能是我的邏輯失敗的地方,我認爲flush會迫使它立即運行tho? – 2009-09-01 10:16:23