JPA Каскад удалить - PullRequest
       6

JPA Каскад удалить

4 голосов
/ 05 мая 2010

Я новичок в JPA / Hibernate. В настоящее время используется EJB3, Hibernate / 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 ERROR [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

1 Ответ

7 голосов
/ 06 мая 2010

Важная часть ошибки показана жирным шрифтом ниже:

javax.ejb.EJBTransactionRolledbackException: <b>Removing a detached instance</b> 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));    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...