2012-11-23 2 views
-1

이미 성장한 프로젝트에서 일하고 있으므로 사용 된 프레임 워크 나 라이브러리의 버전을 변경할 수 없습니다.@Any : 아직 지원되지 않음

실제로 저는 두 엔터티 및 @Inheritance, @DiscriminatorColumn@DiscriminatorValue으로 해결할 수있는 특별한 상황이있었습니다. 지금, 나는 이런 식으로, 상속의 두 클래스에 대한 참조 엔티티를 가지고 :

@Entity 
//Other annotations 
public class A implements IA { 
    //Class body 
} 

@Entity 
//Other annotations 
public class B extends A implements IB { //Note: `IB` extends `IA`. 
    //Class body 
} 

@Entity 
//Other annotations 
public class Container { 
    private IA object1; 
    private IA object2; 
} 

문제는 여기에 하나 object1 및/또는 object2이 될 수 있기 때문에 내가 @Any 주석을 사용하는 것을 시도하고 있다는 것입니다 A 또는 B을 입력하십시오.

here을 언급 한 바와 같이
@Any([email protected](name="objectOneType", length=3),fetch=FetchType.EAGER) 
@AnyMetaDef(idType="long",metaType="string", metaValues={ 
     @MetaValue(targetEntity=A.class, value="A"), 
     @MetaValue(targetEntity=B.class, value="B") 
    } 
) 
@JoinColumn(name = "relatedObjectId") 
private IA object1; 

는, Hibernate의 @Any 주석 패밀리가 나는 4.1를 최대 절전 모드로 전환 할 수 있기 때문에, 나는 알아 내려고 여기 붙어있어, JPA 2에 아무런 대응이없고 : 내가 무슨 짓을했는지하는 것은 이것이다 그것을 작동시키는 방법 또는 그것을 해결하기 위해해야 ​​할 일.

"너무 우아하지 않은"방법은 새로운 엔티티를 만들고 A에서 B로 필드를 복사하여 상속을 지우고 특정 사례를 수정하는 것입니다.

JPA에서 내가 아직 모르는 몇 가지 특정 기능을 잃어 버렸을 수도 있습니다. 그래서 현재 올바른 방향으로 나를 가리킬 수있는 제안을하고 있습니다.

+0

처음부터 Any가 필요한 이유는 무엇입니까? A에 대한 참조는 B가 A를 확장하기 때문에 아무 것도 할 필요없이 B를 가리킬 수 있습니다. –

+0

글쎄, 두 개의 A 요소를 남겨두고 각 종류를 알아 내야 할 것입니다 ... 이제는 궁금합니다. A는 B 객체의 A 전용 필드를 가져 오지 않는 ID를 가지거나 'A object1 = new B()'를 직접 수행 할 것입니까? 이제는 언급 했으니 까 ... 나는 여기에 "과도한 방어력"이있는 것처럼 느껴진다 ... – Gamb

+1

두 필드의 타입은 모두 IA이므로 어떤 타입인지는 알지 못한다. (A 또는 B). B는 A를 확장하므로 B **는 ** A입니다. 변수의 유형은 IA이지만 실제 객체 유형은 A 또는 B가 될 수 있습니다. 그리고 Hibernate는 참조를 적절한 구체 유형의 인스턴스로 채 웁니다 그 자체로. –

답변

2

@Any 주석이 필요하지 않습니다. 다음 있도록 A. 충분 B is 그래서 B는 확장 (. 연관성을 가정하는 것은 ManyToOne이다 그것은 또한 OneToOne 될 수 있음)

public class Container { 
    @ManyToOne 
    private A object1; 

    @ManyToOne 
    private A object2; 
} 

는 는

하이버 네이트의 구체적인 형태를 알아내는 것 두 객체를 모두 단독으로 만들고 A 또는 B 인스턴스로 object1 및 object2를 초기화합니다.

관련 문제