2014-03-02 2 views
1

기본 @Entity가 있고 그 안에있는 모든 것이 포함 가능하므로 (내부의 모든 내용이 부모 없이는 의미가 없으므로) 일반적인 시나리오가 있습니다. 이제 JPA 2.0은 둥지에 다른 @ElementCollection에 정의 된 @Embeddable 내부 @ElementCollection 나를 차단 :Embeddable 및 ElementCollection 중첩

JSR-317 또 다른 내 임베디드 클래스를 포함 포함 가능한 클래스와 기본 유형 퍼갈 클래스 (2.6 컬렉션 임베디드 클래스)는 요소 컬렉션을 포함 할 수 없으며 다 대일 또는 일대일 관계가 아닌 엔티티에 대한 관계를 포함 할 수 없습니다.

이제 질문 이유는 무엇입니까? 간단한 예 :

@Entity 
public class Tournament { 
    @Id 
    Long id; 

    @ElementCollection 
    @CollectionTable 
    private List<Edition>; 
} 

@Embeddable 
public class Edition { 

    @ElementCollection 
    @CollectionTable 
    private List<Round> 
} 

@Embeddable 
public class Round { 

    blabla; 
} 

무엇이 문제입니까? 이것은 단지 예일 뿐이며, 라운드와 에디션을 엔티티로 정의하고 문제를 해결할 수 있습니다. 그러나 여러 가지 이유로 제 경우에는 부모가 없으면 매우 중첩 된 것을 이해할 필요가 없습니다.

왜 JPA 2.0에서이 작업을 중단해야합니까? 따라서

판 자체 @Embeddable이며, 원형의 요소의 컬렉션을 포함하고 :

답변

6

상황은 당신이 붙여 사양 요소가 위반하는 내에 포함되어

퍼갈 클래스 (판) 요소 컬렉션 (Tournament.editions)에는 요소 컬렉션 (Edition.rounds)이 없어야합니다.

http://en.wikibooks.org/wiki/Java_Persistence/ElementCollection에서 예제를 보면 FK만으로도 하위 (Edition)가 소유자 (Tournament.id)로 매핑된다는 것을 알 수 있습니다. 자체의 ID 열 - 약한 엔티티로 자체 ID가 없으며 토너먼트의 ID를 참조하여 정의됩니다.

라운드를 진행하는 동안 약한 엔티티 인 경우 버전에 대한 FK 참조로 정의해야합니다.하지만 이미 자체 ID가 없으므로 DB에 매핑 할 수 없습니다. 버전에 ID를 추가하지 않아도됩니다. 어느 시점에서 그 자체로 엔티티가되며 단순히 @Embeddable이 될 수 없습니다.

아래의 주석에서 위키 피 디아 예제를 보겠습니다. - http://en.wikipedia.org/wiki/Weak_entity - 약한 엔티티의 예에는 OrderNumber, CustomerNumber 등이 있으며 다른 객체에 포함될 때만 의미가 있습니다.

부모 매핑이있는 엔티티 (예 : 에디션의 토너먼트 참조) 및/또는 양방향 참조가있을 수 있습니다. 부모가 @ManyToOne 주석에 nullable = false 속성을 가진 Edition에서 정의되도록하고 따라서 모델의 요구 사항을 시행 할 수 있습니다.

+0

질문에 썼 듯이 모델에 필요합니다. 토너먼트가없는 버전은로드 할 수 없어야하며, 토너먼트가없는 경우에는 버전이 존재할 수 없습니다. ER 다이어그램에서 잘 알려진 [Weak Entity] (http://en.wikipedia.org/wiki/Weak_entity)의 개념이지만 JPA에서는 제대로 구현되지 않은 것처럼 보입니다. JPA에서 왜 구현 가능한 요소 콜렉션을 더 많이 포함 할 수 없는지 이해하려고 시도했습니다. 구현 문제가있을 수 있습니다. 실제 상황을 설명하는 일반적인 방법입니다. – Francesco

+0

자세한 답변을 보내 주셔서 감사합니다.결국 Embeddable은 약한 엔티티의 아이디어와 정확히 일치하지 않습니다. 약한 엔티티는 외부 엔티티와 자신의 ID로 구성된 합성 기본 키를 가져야하며 이는 Embeddable 객체에 해당하지 않습니다. 약한 개체를 매핑하는 데 더 직접적인 것이 있다고 생각했지만 마지막 옵션은 가장 합리적이라고 생각합니다.하지만 잘못되었습니다. – Francesco