이미 성장한 프로젝트에서 일하고 있으므로 사용 된 프레임 워크 나 라이브러리의 버전을 변경할 수 없습니다.@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
을 입력하십시오.
@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에서 내가 아직 모르는 몇 가지 특정 기능을 잃어 버렸을 수도 있습니다. 그래서 현재 올바른 방향으로 나를 가리킬 수있는 제안을하고 있습니다.
처음부터 Any가 필요한 이유는 무엇입니까? A에 대한 참조는 B가 A를 확장하기 때문에 아무 것도 할 필요없이 B를 가리킬 수 있습니다. –
글쎄, 두 개의 A 요소를 남겨두고 각 종류를 알아 내야 할 것입니다 ... 이제는 궁금합니다. A는 B 객체의 A 전용 필드를 가져 오지 않는 ID를 가지거나 'A object1 = new B()'를 직접 수행 할 것입니까? 이제는 언급 했으니 까 ... 나는 여기에 "과도한 방어력"이있는 것처럼 느껴진다 ... – Gamb
두 필드의 타입은 모두 IA이므로 어떤 타입인지는 알지 못한다. (A 또는 B). B는 A를 확장하므로 B **는 ** A입니다. 변수의 유형은 IA이지만 실제 객체 유형은 A 또는 B가 될 수 있습니다. 그리고 Hibernate는 참조를 적절한 구체 유형의 인스턴스로 채 웁니다 그 자체로. –