소유자 엔티티가 참조를 잃을 때 JPA가 소유 한 엔티티를 삭제하지 않는 이유는 무엇입니까?

StackOverflow https://stackoverflow.com/questions/1133179

  •  16-09-2019
  •  | 
  •  

문제

답변 목록 (JPA 엔티티)을 소유 한 JPA 엔티티 "요청"이 있습니다. 다음은 request.java에서 정의 된 방법입니다.

@OneToMany(cascade= CascadeType.ALL, mappedBy="request")
private List<Answer> answerList;

그리고 대답으로. 자바 :

@JoinColumn(name = "request", referencedColumnName="id")
@ManyToOne(optional = false)
private Request request;

프로그램 실행 과정에서 요청의 답변 목록에 답변이 추가되거나 제거 될 수 있거나 실제 목록 개체를 대체 할 수 있습니다. 내 문제는 다음과 같습니다. 요청을 데이터베이스에 병합 할 때 답변은 사용된 목록에있는 것은 데이터베이스에 보관됩니다. 즉, 요청이 더 이상 참조를 보유하지 않는 답변 (목록을 통해 간접적으로)이 삭제되지 않습니다.

마치 요청을 데이터베이스에 병합 한 다음 다시 가져 오면 답변 목록이 동일하지 않을 수 있습니다. 프로그래밍 실수를하고 있습니까? 데이터베이스의 답변이 요청 목록의 답변이 정확히 있는지 확인하는 주석이나 설정이 있습니까?

해결책은 원래 답변 목록을 참조 한 다음 EntityManager를 사용하여 요청을 병합하기 전에 각각의 기존 답변을 제거하는 것이지만 더 깨끗한 방법이 있어야합니다.

도움이 되었습니까?

해결책

JPA 1.0에서는 JPA에서 수행 할 작업을 수행 할 수 없습니다. 간단히 말해서, 모든 관계 관리는 컬렉션에서 고아를 제거하는 것을 포함하여 응용 프로그램에서 수행해야합니다 (이는 원하는 것).

JPA 2.0에서는 지원을 수행하지만 (세부 사항을 알지는 못하지만) 구현에 따라 업그레이드가 쉽지 않을 수 있습니다.

최대 절전 모드와 같은 것을 직접 사용할 수 있지만 여전히 많은 JPA 1.0 주석 등을 사용할 수 있습니다. 이에 대한 세부 정보도 제공 할 수 없습니다.

제 경우에는 반사를 통해 자동으로 컬렉션 병합을 처리하기 위해 일반 코드를 작성했습니다.

다른 팁

eclipselink를 사용하고 @privateowned 주석을 응답 목록에 넣으면 도움이됩니다.

매핑 된 관계에서 추가 속성을 지정하는 것은 불법입니다. 대신 요청에서 @dependentElement 주석을 사용할 수 있습니다.

최대 절전 모드를 JPA 제공 업체로 사용하는 경우 추가 할 수 있습니다.

@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)

답변 목록에서. 이것은 이미 사용하는 JPA 주석 외에도 작동합니다. JPA 2 (대부분/모든 JPA 제공 업체는 현재 생산 준비 구현이 없음) 자체적으로이를 수행 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top