2013-08-23 8 views
0

이 있는데, 그 속성은 class B입니다.최대 절전 모드 - 캐스케이드 옵션이있는 ManyToOne/OneToOne

모든 class A에 대해 class B이 하나만 있다는 것을 알고 있으므로 OneToOne으로 매핑합니다. 실수로 동일한 class B을 두 번째 에 추가하는 경우 은 모두 class B을 참조합니다 (따라서 CascadeType.ALL이 설정된 경우 해당 개체 중 하나를 삭제하면 다른 사람이 참조하는 주소가 제거됩니다). 이것은 모두 의미가 있습니다. 나는 데이터베이스에 class B의 복수 (같은) 경우가있을 수 있음을 알고, 내가 원하는 경우

그러나,이를 사용하기 위해 class A의 내가 ManyToOne 및 JPA로이 엔티티를 매핑 할 수 있습니다 생각이있는 경우 속성 지속/hibernate는 데이터가 이미 데이터베이스에 있는지 (로딩 한 후 평등을 사용하는지) 확인하기 위해 필요한 검사를 처리합니다. 이것이 사실이 아닌 것 같습니다.

ManyToOne 관계는 위의 OneToOne과 정확히 같은 방식으로 작동 - 즉, 최대한 빨리, 너무 '클래스 B'개체가 삭제 가져옵니다 class B 객체를 참조하는 class A 개체 중 하나를 삭제로 (경우에도 다른 곳에서 참조). JPA/hibernate가 class B 개체를 삭제하기 전에 다른 개체에 의해 참조되지 않았는지 확인해야합니다 (CascadeType.ALL도 설정 됨 - ManyToOne 관계로 표시되어 있음).

여기에 뭔가가 있습니까?

+0

엔티티와 엔티티 관계를 어떻게 선언했는지 정확히 알 필요가 있습니다. –

+0

우리가 더 나은 방법으로 당신을 도울 수 있도록 실제 사례를 줄 수 있습니까? –

+0

물론입니다. 'Address'를 참조한'Person'. 나는'Address' 객체에서 평등을 행별로 동일하게 구현했으며 hashcode 메소드도 구현했습니다. 위와 다른 모든 것 ... – user2482461

답변

0

불행히도 원하는 것을 얻을 수있는 간단한 방법이 없습니다.

계단식 제거는 매우 간단합니다. 계단식 측면의 엔터티가 제거되면 참조 된 쪽의 엔터티도 제거됩니다. 다른 엔티티에서 참조하는 경우에도 마찬가지입니다. 데이터베이스의 외래 키 제약 조건으로 인해 기본 행이 삭제되는 것을 방지하고 예외가 발생하지만 JPA 공급자가 엔티티를 제거하려고 시도한다는 점이 중요합니다. 이것은 당신이 원하는 행동이 아니므로 계단식 제거는 당신을위한 것이 아닙니다.

JPA에도 고아 제거라는 기능이 있지만 이와 유사한 제한 사항이 있습니다. 공유 된 객체를 관리하는 데 사용할 수 없습니다. @ManyToOne 관계에서도 신고 할 수 없습니다.

대신이 삭제를 수동으로 처리해야한다고 생각합니다. EntityManager을 사용하여 소유 객체를 직접 삭제하는 대신 객체를 삭제하는 서비스 객체 (데이터 액세스 객체 또는 저장소라고도 함)에 삭제를 캡슐화 한 다음 참조 된 객체도 삭제해야하는지 확인합니다.

감사합니다. 하지만 슬프게도, 내가 아는 한 JPA가 자동화 할 수있는 것이 아닙니다.

관련 문제