2010-05-05 160 views
4

我是JPA/Hibernate的新手。目前使用EJB3,Hibernate/JPA。我有一個inheritacnce結構如下..JPA級聯刪除


@Entity 
@DiscriminatorColumn(name = "form_type") 
@Inheritance(strategy = InheritanceType.JOINED) 
@GenericGenerator(name = "FORMS_SEQ", strategy = "sequence-identity", parameters = @Parameter(name = "sequence", value = "FORMS_SEQ")) 
@Table(name = "Forms") 
public abstract class Form{ 
    //code for Form 
} 

@Entity 
@Table(name = "CREDIT_CARDS") 
@PrimaryKeyJoinColumn(name="CREDIT_CARD_ID") 
public class CreditCardForm extends Form { 
     //Code for CreditCards. 
} 

當我添加一行保存行正確插入到父和子表。但是,當我嘗試刪除時出現錯誤 -
10:19:35,465錯誤[TxPolicy] javax.ejb.EJBTransactionRolledbackException:刪除分離的實例com.data.entities.form.financial.CreditCard#159?

我正在使用一個簡單的for循環來確定繼承類型--CreditCard或DebitCard,然後調用entityManager.remove(entity)。我究竟做錯了什麼?

代碼刪除..

for(Form content: contents){ 
    if(content.getType()==Type.CREDIT_CARD){ 
    creditCardService.delete((CreditCard)content); 
    } 

感謝。

WM

+0

好的,得到了答案。 JPA上下文需要在實際刪除之前加載。快速修復是調用getEntityManager()。getReference(),然後調用delete/remove。 謝謝大家閱讀主題。 – 2010-05-05 18:39:14

回答

7

錯誤的重要的部分被示出在以下粗體:

 
javax.ejb.EJBTransactionRolledbackException: Removing a detached instance com.data.entities.form.financial.CreditCard#159? 

這簡直是不被EntityManager#remove(Object)操作允許的。如Java文件,它拋出:

IllegalArgumentException - 如果不是一個實體或如果脫離實體

所以,你真的需要重新連接實體之前將其刪除:

CreditCard mergedCreditCard = em.merge(creditCard); // reattach the creditCard 
em.remove(mergedCreditCard); 

或者更簡單地說:

em.remove(em.merge(creditCard));  
+0

謝謝帕斯卡。 – 2010-05-08 00:21:34