2011-03-27 4 views
0
나는 다음과 같은 클래스가

:JPA : 단방향 OneToMany 질문

class A{ 
    @OneToOne(cascade=CascadeType.ALL) 
    private B b; 
} 

class C{ 
    @ManyToOne 
    private A a;  
} 

class B{ 
    @OneToOne 
    private A a; 

    @MapKey(name = "name") 
    @OneToMany(cascade = CascadeType.ALL, ...) 
    @JoinColumn(...) 
    private Map<String C> cs; 
} 

을 어떻게 어디에 B.a == C.a 가입 B.cs에 매핑을 지정해야합니까?

이것이 가능합니까? 아니면 C.a를 C.b로 변경해야합니까? (엔티티 B는 단순한 도우미 클래스이므로 그대로 유지하는 편이 낫습니다.) B를 @Embeddable로 변경하려고 시도했지만지도가 포함 가능하지 않습니다.

답변

0

나는이 어쩌면 당신이 A의 ID를 참조 일시적인 속성을 추가 할 수 있습니다, 당신을 위해 작동하지 않는 경우 수는 A.

에서 B를 확장

@Transient 
Integer getId1() { 
    return a.getId(); 
} 

을 생각하고 C 가입 B의 기본 키 대신 id1을 사용하십시오.

편집 : 작동하지 않습니다.

+0

"파생"이란 무엇을 의미합니까? 계승?. 이것은 A가 몇 가지 속성을 갖고 B가 몇 가지 속성을 갖는 구성입니다. is-a 관계 선박 (상속)은 여기에 잘못 될 것입니다. – Puce

+0

여기서 '확장'을 의미합니다. 당신이 옳은 것 같다. 이 경우, 개인적으로 또 다른 기본 클래스 _A를 만들고 A와 B를 _A로 확장합니다. –

1

JPA는 모든 관계가 ID (외래 키가 기본 키를 참조)로되어 있어야합니다. 그래서 C에서 B로 @ManyToOne을 추가해야합니다. 또는 B의 Id가 A의 외래 키인지 확인하십시오 (B에서 A로 @OneToOne에 @Id를 추가하고 A의 다른 @Id를 제거하십시오). B가 OneToOne 대신 A의 하위 클래스 인 경우이 방법도 사용할 수 있습니다.

EclipseLink를 사용하는 경우 관계에 대한보다 복잡한 기준을 정의 할 수 있습니다. DescriptorCustomizer 및 OneToManyMapping API를 사용하여 OneToMany의 외래 키를 정의해야합니다.

+0

외래 키 (C에서)는 기본 키 (A)를 참조합니다. B의 기본 키가 아닙니다. JPA가 B를 @Embeddable로 정의 할 수 없다는 사실에 고심합니다. 하지만 C, B에서 @ManyToOne, B에서 A로 @OneToOne의 @ID (좋은 사례입니까?) 또는 EclipseLink 고유의 매핑 (JPA 표준을 그대로 유지)이 맞습니까? – Puce