2012-08-08 4 views
3

다음과 같은 설정이 있습니다. 다양한 엔티티 (Projects, Tests, Users)가 있고 TestReports이 있습니다. TestReports은 다른 엔터티를 참조하고 파일 시스템의 일부 추가 데이터를 참조합니다.JPA/Hibernate에서 삭제 된 엔티티를 참조하십시오.

보고서가 생성되어 삭제되지 않습니다 (감사 목적). 그러나 다른 엔티티는 삭제할 수 있습니다. 이는 보고서가 일부 삭제 된 항목을 참조 할 때 상황을 초래합니다. 이것은 비즈니스 관점에서 보면 괜찮습니다. 보고서는 삭제 된 엔티티 레이블 대신 [deleted id123]을 표시 할 수 있으며 괜찮을 것입니다. 그러나 삭제 된 엔터티를 참조하는 보고서를로드하려고하면 javax.persistence.EntityNotFoundException이 표시됩니다.

ID가있는 팬텀 오브젝트를 생성하기 위해 Hibernate/JPA에 알려주는 방법이 있습니까?이 경우에는 isDeleted 플래그가 필요합니까?

Hibernate Envers 문서에서 수정 내역을 트래버스 할 때 이와 비슷한 것을 지원하지만 '정상'엔티티에서 사용할 방법을 찾지 못했습니다. Envers 문서에서

: 엔티티가 결실 된 버전이 결과에 포함되어야 하는지를

번째 파라미터는 selectDeletedEntities 지정. 예인 경우 엔 해당 엔티티의 수정 유형이 DEL이고 ID를 제외한 모든 필드는 null입니다.

나는 모든 객체에 deleted 플래그를 도입하여 해결 방법을 알고 그리고 만약 소프트 삭제하는 대신 실제 제거의 사용합니다. 그러나 이로 인해 추가 오버 헤드가 추가되는 것을 피할 수 있습니다.

답변

4

내가보기에 이것이 확실한가요? @NotFound(action=NotFoundAction.IGNORE) 어노테이션을 사용하여 EntityNotFoundException을 고치기보다는 필드에 null을 설정하도록 hibernate에 지시 할 수있다. 그것에 대해 많은 문서가 없으므로, 그것을 사용하는 방법을 찾을 수 here.

+0

감사합니다. 이것은 거의 내가 원하는 것처럼 보입니다. 실제 no reference와 무시한 것을 무시하는 표준 방법이 있는지 알고 있습니까? – Michal

+0

나는 모르지만 나는 최대 절전 모드가 그런 시설을 제공한다고 생각하지 않는다 : S. – Augusto

0

나는 이와 비슷한 상황이 있으며 나는 이것을했다.
나는 결코 이런 것들을 삭제하지 않는다. 오히려 나는 삭제 된 것에 대해 deletion time을 설정합니다. 데이터를로드 할 때 객체가 성공적으로 반입되지만 deletion time을 확인하면 [deleted]이 표시됩니다.

그러나 내가 생각해 낸 해결책은 다른 것을 찾을 수 있습니다.
캐치 javax.persistence.EntityNotFoundException 수동으로 해당 필드에 같은 값을 삽입 :
당신이이 일을 시도 할 수 있습니다 업데이트]

. 이 경우 삭제 된 항목과 실제로 참조가없는 항목을 볼 수 있습니다.

+0

고마워요, 당신의 솔루션은 분명히 더 많은 유연성을 제공하지만, 아마 나를 위해 과잉 될 것입니다. – Michal

+0

내 대답이 업데이트되었습니다. 이것은 당신을 위해 일할 수도 있습니다. –

+0

뭔가를 놓칠 수도 있지만'query.getResultList() '를 호출 할 때'EntityNotFoundException'을 잡아 내 자신을 어떻게 도와 줄 수 있는지 이해할 수 없습니다. – Michal

관련 문제