2014-10-13 5 views
5

나는 여러 가지 관계 (오직 @ManyToOne)와 관련이있는 엔티티를 열심히 삭제하려고 애 쓰고있다. 그러나 Hibernate는 아무것도 삭제하지 않는다. em.remove을 호출 한 후에는 모든 것이 변하지 않는다. 왼쪽Hibernate EntityManager : 참조 된 엔티티가 작동하지 않는다.

public class E6{ 

    @ManyToOne(optional = false) 
    private E1 e1;  

    @ManyToOne(optional = false) 
    private E2 e2; 

    @ManyToOne(optional = false) 
    private E3 e3; 

    @ManyToOne(optional = false) 
    private E4 e4; 

    @ManyToOne(optional = false) 
    private E5 e5; 
} 

(:

@Entity 
public class EX { 
    @OneToMany(mappedBy = "eX", fetch = FetchType.EAGER, cascade = { CascadeType.PERSIST, CascadeType.REMOVE }) 
    private Set<E6> e6s; 
} 

E6 자체가 역을 @ManyToOne 관계가 있습니다


나는이 같은 문제의 엔티티 (E6를) 참조 5 엔티티 (E1 - E5)가 외부 입력란, 추가 항목 등)


em.remove(instanceOfE6)으로 전화 할 때마다 간단히 이 표시되지 않습니다.이 발생합니다. 나는 Hibernate SQL-Output을 추가 했으므로 DELETE 쿼리를 한 번 실행하는 것을 볼 수 없다.

em.remove(em.merge(instanceOfE6)); 

하지만 아무것도 : 삭제가 아약스 요청과 신선한의 EntityManager에서 일어날 수 있기 때문에

, 나는 내가 법인 관리되지 않는 예외를 얻을 수 otherwhise의 원인, 삭제하기 전에 병합 전화를 추가 . 상태는 변경되지 않습니다.

그래서 엔티티를 제거하기 전에 모든 관계를 지우는 방법 @PreRemove을 추가하려고했습니다. 메서드가 호출되지 않습니다.

다양한 계단식 조작 (Cascade.ALL 포함)을 시도했지만, 제거와 지속이 필요하기 때문에 작동해야합니다.


내가 (그래서 가장 가능성이 일을하고자, 각 엔티티는 대리 ID를 가지고) 기본 삭제 정책을 사용하는 방법에 대한 생각 -하지만 모두가 AJAX 호출 내에서 발생하기 때문에, 그 사용하지 않으 , 나는 모든 관련된 엔티티를 다시 가져 오지 않고서도 Persistence-Cache를 업데이트하고 싶기 때문에 ...

아이디어가 있으십니까?

더 많은 자료가 필요하면 의견을 보내주십시오. 행운 -


는 또한 최대 절전 모드가 해제 된 개체를 whipe 것으로 기대하고, 모든 관계 (현명한 객체)에서 문제의 엔티티를 제거하고 나머지 기관 중 하나에 em.merge() 전화를 시도했다.

+1

거래를 위탁 했습니까? –

+0

'em.flush()'를 호출 했습니까? – jmvivo

+0

@DavidLevesque 자동 커밋 모드에서 최대 절전 모드를 실행 중 ... – dognose

답변

13

나는 문제 (들)을 파악 - 실제 그 두 가지가 있었다 : 내가 언급 한 바와 같이

가, 삭제가 아약스에서 일어난 있어야 (누군가가 비슷한 문제를 통해 실수를 한단다 경우, 여기를 떠나) 의뢰. 따라서 간단한 호출

em.remove(instanceOfE6); 

java.lang.IllegalArgumentException: Removing a detached instance 예외가 발생했습니다.- 간단하지만 작동하지 않았다

em.remove(em.merge(instanceOfE6)); 

오류가 발생하지 않은 : 그래서, 병합을 사용하여 접근을 시도했다. 이 게시물에서 언급 한 바와 같이 내가 추적 로깅 최대 절전 모드를 사용할 수 : JPA/Hibernate remove entity sometimes not working 엔티티를 제거하는, 참으로 무엇이 잘못되었는지 파악하고하는 결과 : 분명히

TRACE [org...DefaultPersistEventListener] un-scheduling entity deletion ... 

제거 할 수있는 기업은 여전히 ​​다른 엔티티에 연결되어 hibernate가 삭제 작업을 중단시키는 문제로 이어 지므로 삭제하기 전에 관계를 제거하려고했습니다. E6의 예에서 알 수 있듯이 @ManyToOne(optional = false)을 사용 했으므로 발신 참조를 null로 설정할 수 없거나 merge을 호출 할 때 예외가 발생합니다.

필자가 삭제하려고하는 엔티티의 나가는 관계를 정리할 필요가 없다고 가정했기 때문에 관계를 정리하는 첫 번째 시도는 "세트 정리"뿐이었습니다. 그것은 아니지만, 나는 잠시 후에 자세하게 개요 것 :

그래서, 코드가 지금

instanceOfE6.getE1().getE6s().remove(instanceOfE6); 
instanceOfE6.getE2().getE6s().remove(instanceOfE6); 
instanceOfE6.getE3().getE6s().remove(instanceOfE6); 
instanceOfE6.getE4().getE6s().remove(instanceOfE6); 
instanceOfE6.getE5().getE6s().remove(instanceOfE6); 

em.remove(em.merge(instanceOfE6)); 

같은 문제처럼 보였다 : 삭제가 중단되었습니다. 나는 명백한 사실을 놓쳤다. 그 전화는 merge이다. instanceOfE6에서 다른 엔티티에 nullable-references가 없었으므로으로 방금 삭제 한 세트 내의 항목을 복원하십시오 (). 따라서 삭제가 다시 중단되었습니다.

마지막으로, 참조 및 최종 삭제 제거하기 전에 병합을했다 :

if (!em.contains(instanceOfE6)){ 
    instanceOfE6 = em.merge(instanceOfE6); 
} 

instanceOfE6.getE1().getE6s().remove(instanceOfE6); 
instanceOfE6.getE2().getE6s().remove(instanceOfE6); 
instanceOfE6.getE3().getE6s().remove(instanceOfE6); 
instanceOfE6.getE4().getE6s().remove(instanceOfE6); 
instanceOfE6.getE5().getE6s().remove(instanceOfE6); 

em.remove(instanceOfE6); 

내가 모든 것을 100 % 정확한 설명하면 내가 아주 확실하지 않다, 그러나 적어도 나는 재현하여 문제를 해결할 수 있습니다 코드를 앞뒤로 바꾼다.

+2

당신은 생명의 은인입니다. 2 시간 동안 이것으로 고투하고있다. 대단히 고마워. 사람들은 엔티티 트리를주의해야합니다. groupToRemove.getParent(). getSubgroups(). remove (groupToRemove)를 작성하고 parent를 cascade = CascadeType.MERGE와 매핑해야했습니다. 건배 – jpangamarca

+1

'groupToRemove.getParent(). getSubgroups(). remove (groupToRemov e)'그것은 내가 한 일입니다. 그것은 이상하게 보입니다. 그러나 그것에 들어가기 : 그것은 논리적입니다 :-) – dognose