2009-12-28 2 views
1

목표는 소유자가 삭제 될 때 종속 파일을 모두 제거하는 것입니다. 다음과 같은 클래스가 있습니다 :소유자 엔티티의 링크가없는 JPA에서 종속성을 어떻게 지정합니까?

@Entity 
class Dependent {  
    @ManyToOne(cascade = CascadeType.PERSIST, fetch = FetchType.LAZY, optional = false) 
    @Column(name = "OWNER") 
    private Owner _owner; 
} 

@Entity 
class Owner { 
... 
} 

현재 구현에서 종속성은 소유자가 삭제 된 후에도 여전히 존재합니다.

Owner는 Dependent에 대한 링크가 없으므로 변경할 수 없으므로 @Dependent annotation 또는 cascade = DELETE를 사용할 수 없습니다.

JPA는 이러한 "역 종속성"을 지원합니까? 또 다른 질문은 _owner 필드가 삭제되는 동안 optional = "false"가 보장된다는 것입니다.

답변

0

두 가지 옵션이 있습니다. 가방/세트/목록을 Ownercascade-delete으로 추가해야합니다. 이 가방은 게으르며 결코 액세스 할 수 없으므로 삭제할 때까지 성능에 영향을 미치지 않습니다.

다른 옵션은 소유자를 삭제할 때 쿼리로 Dependent 인스턴스를 삭제하는 것입니다. JPA는 인스턴스의 자동 가비지 콜렉션을 수행하지 않기 때문에 어쨌든 수동으로 삭제를 시작해야하므로 모든 사용자가 단일 함수를 사용하여 소유자를 삭제 한 다음 호출을 추가하여 해당 아이를 삭제해야합니다.

+0

소유자 클래스를 수정할 수 없습니다. JPA는 종속 클래스에서 종속성을 지정하는 옵션을 제공하지 않습니다. 그래서 "optional = 'false'"는 무엇입니까? – oakjumper

+0

'optional = false'는 매핑을 담당하는 쪽을 선언합니다. 두 클래스 모두에서 여전히 매핑이 필요합니다. 소유자 클래스를 변경할 수 없으면 원시 쿼리를 사용하고 모든 작업을 수동으로 수행해야합니다. 매번 캐시를 플러시하는 것을 잊지 마십시오. –

+0

"소유자 클래스를 수정할 수 없습니다"라는 문제가 있습니다. 이것이 당신이 풀어야 할 문제입니다. 소유자 클래스를 변경하거나 해결 방법을 디버깅하는 데 몇 주를 소비하는 것이 더 복잡한 지 여부를 결정해야합니다. 또는 HBM 파일로 소유자 클래스를 매핑 할 수도 있습니다. Spring을 사용하는 경우 주석을 이전 XML 구성과 쉽게 섞을 수 있습니다. –

0

이 문제를 해결하는 방법은 소유자와 동일한 테이블을 공유하는 하위 클래스를 사용하고 종속성을 가리키는 모음을 추가하는 것입니다. Aaron Digulla의 'optional = false'에 동의하지 않습니다.이 문은 선택이 선택 사항임을 보여주고, bidrectional assocation이 없기 때문에 Dependent가 항상 매핑을 처리합니다.