2010-02-01 4 views
10

를 계속 전달 :삭제 된 개체 내가 엔티티의 종류가 예외를

문서 을 | n .. to .. 1 | DocumentType | 1 .. to .. n | PropertyType | 1 .. to .. n | DocumentProperty

단순히 같은 문서를 제거하려고 : entityManager.remove (문서);

그러나 오류가 소성되어

16 : 45 : 51,499 ERROR [시임 서블릿 리소스]의 Servlet.service() 서블릿 심 자원 서블릿 예외를 javax.persistence.EntityNotFoundException 던져 : 삭제 실체 지속에 전달 : [up.docstore.PropertyType 번호]를

문제는 여기에서 온 것 같다

@OneToMany(mappedBy = "documentType", cascade = {CascadeType.ALL}, fetch = FetchType.EAGER) 
@ForeignKey(name = "FK_DOCUMENT_TYPE__PROPERTY_TYPE") 
@Sort(type = SortType.NATURAL) 
private SortedSet<PropertyType> propertyTypes = new TreeSet<PropertyType>(); 

CascadeType.PERSIST가 모두 제거되면 작동합니다. 하지만 나는 그것을 필요로하고 또한 그것을 필요로 EAGERLY.

다른 솔루션을 아는 사람이 있습니까?

편집 : 삭제 된 DELETE_ORPHAN 캐스케이드는 제거되었지만 여전히 동일한 문제입니다.

답변

12

해결 방법 : @ManyToOne 관계에 CascadeType.REMOVE가

  • 이 있었다! 그것을 제거했습니다.

왜이 솔루션?

  • 그 부모에 관련된 다른 아이들이있을 수 있기 때문에 반드시 부모를 삭제하지 않는 아이를 삭제하려면.
+3

예 - 당신이 그것을 보여주지 않았기 때문에 그것은 우리에게서 숨겨졌습니다;) – Bozho

0

@OneToMany@Cascade의 두 위치에 cascade을 설정하는 것을 볼 수 있습니다. 난 당신이 이해 될 필요가에게 좀 더 상황을보고하고있다


오류 ... 하나가 다른보다 우선하는 경우이 문제가 될 수 있다고 생각합니다. "이미 삭제 된 엔티티 삭제"에는 명확하게 두 가지 작업이 포함됩니다. 이전 상태, 작업 및 이후의 상태에 대한 세부 정보를 제공해야합니다 ("상태", 즉 데이터베이스의 상태 ...).

+0

안녕하세요, 저는 방금 해결책으로 극복하기 위해 DELETE_ORPHAN 캐스케이드를 추가했지만 문제는 아닌 것으로 보입니다. 어쨌든, 나는 DELETE를 통해 간단한 휴식을 취하고, 삭제 될 문서의 ID를 보낸다. 그래서 ... 아주 간단한 시나리오. –

+0

에 따라 hibernate docs (지금은 lazy)가'@ Cascade' _ JPA 'cascade' 속성에 _adds_를 추가하고 그것을 덮어 쓰지 않습니다. – Bozho

+0

@ Bozho 이론적으로이 정밀도에 감사드립니다 ;-). 누군가 연습에서 이것을 시험해보기 바란다, 아마 Cristian ?? :-) – KLE

0

캐스케이드 옵션이 Entity Manager에서 em.remove (document)를 호출 할 때이 객체 또는 체인의 다른 객체를 유지해야한다고 생각하는 것처럼 보입니다. 더 자세한 내용이 필요합니다 ...

6

전에 에 remove()을 호출했다고 가정합니다.오직 "루트"개체에 대한 remove()에 전화를 걸어 같은 뭔가 다른 사람을 제거 :

document.getDocumentType().getPropertyTypes().remove(propertyType); 

그리고 유지 당신은 다음 당신을 확인 후 수동으로 다른에 remove()라고하지 않은 DELETE_ORPHAN

기관, 호출 시도 :

document = entityManager.merge(document); 
entityManager.remove(document); 

EntityManager 먼저 세션에 객체를 재접속이 너무.

+0

안녕 Bozho. 나는 문서에 대해서만 제거를 요청하고 나머지 엔티티는 캐스케이드를 통해 제거 될 것으로 예상했다. document.getDocumentType(). getPropertyTypes().를 호출하려면 remove (propertyType); 속성 집합에 foreach를 할 필요가 및 하나를 제거 할 때 속성 형식의 수가 동일하게 유지되지 않기 때문에 예외가 발생합니다 ... –

+0

당신이 어딘가에 제거 호출하지 여부를 확인 tripple;) 다음 내 참조하십시오 업데이트 – Bozho