2010-03-18 3 views
2

나는 에 문제로 최대 절전 모드를 실행하는거야 어디 다음과 같은 오류가 발생하는 엔티티의 그룹을 삭제할 때 :

javax.persistence.EntityNotFoundException: deleted entity passed to persist: [com.locuslive.odyssey.entity.FreightInvoiceLine#<null>]

이 일반적으로 그렇게하지를 엔티티가 삭제되지만 엔티티가 소속 된 콜렉션에서 제거되지 않기 때문에 추적하기가 어렵습니다.

이 경우 필자는 생각할 수있는 모든 목록 (복잡한 데이터 모델)에서 엔티티를 제거했습니다. JBoss를 Trace에 로깅하고 계단식으로 연결되는 콜렉션을 볼 수 있습니다. 그러나 삭제하고있는 엔티티가 들어있는 Collection을 찾을 수없는 것 같습니다.

누군가이 특별한 예외를 해결하기위한 조언이 있습니까? 특히 소유 컬렉션이 무엇인지 식별 ​​할 수있는 방법을 찾고 있습니다.

감사합니다.

+2

CascadeType.ALL이있는 경우 CascadeType.PERSIST를 제거하고 어떤 결과가 발생하는지 확인할 수 있습니다. –

+1

당신의 매핑/주석과 코드를주세요. – Bozho

+0

@ 페타 : +1. 그러나 자식 엔티티를 더 쉽게 추가 할 수 있도록 CascadeType.PERSIST를 추가하는 것을 선호합니다. – Damo

답변

2

나는 마지막 단계로

getEntityManager().remove(freightInvoiceLine);

을하고 건의 할 것입니다. 처음에는 컬렉션에서 자식을 제거한 다음 실제로 삭제하는 것이 좋습니다. 많은 경우 두통을 덜어줍니다.

+0

명령문이 대기열에 올려 져 있고 flush() 또는 메서드 경계 (자동 플러시 인 경우)에서만 실행되므로 어떤 차이가 있는지는 알 수 없습니다. – Damo

2

마침내 그것을 발견했습니다. 그리고 그것은 정확히 내가 기대했던 좌절감있는 "find the list"의 일종입니다.

삭제를 수행하는 코드가 Seam의 EntityHome을 확장하고있었습니다.

public class FreightInvoiceHome extends EntityHome<FreightInvoice> { 
    public void deleteLine(FreightInvoiceLine freightInvoiceLine) { 
     getEntityManager().remove(freightInvoiceLine); 
     freightInvoiceLine.getShipInstrLineItem().getFreightInvoiceLines().remove(freightInvoiceLine); 

     /* These next two statements are effectively performing the same action on the same FreightInvoice entity 
     * If I use the first one then I get the exception. If I use the second one then all is ok. 
     */ 
     getInstance().getFreightInvoiceLines().remove(freightInvoiceLine); 
     //freightInvoiceLine.getFreightInvoice().getFreightInvoiceLines().remove(freightInvoiceLine); 
    } 
} 

나는 이것이 dodgy equals()/hashcode()로 인한 것일 수 있지만 둘 다 대체 한 후에는 차이가 없다고 생각했습니다.

두 사람의 차이점을 설명 할 수 있으면 받아 들인 사람을 다른 사람에게 바꿔 드리겠습니다.