我正在一个已经成长的项目中工作,所以我将无法更改任何使用过的框架或库的任何版本。@任何:不支持
其实,我有一个特殊的情况,我设法解决与两个实体和@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;
}
这里的问题是,我试图用@Any标注,因为无论object1
和/或object2
可以的键入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;
如前所述here,Hibernate的@Any
注释族在JPA 2中没有对应和,因为我不能切换到Hibernate 4.1,我坚持在这里试图找出一种使它工作的方式,或者我应该怎么做来解决它。
“不那么优雅”的方式是创建一个新实体并将字段从A复制到B,擦除继承并修复特定情况。
也许,我在JPA中失去了一些我还不知道的特殊功能,所以我现在对此表示欢迎,并且感谢任何可能指向正确方向的建议。
为什么你需要首先放置?对A的引用可以指向B,而不需要做任何事情,因为B扩展为A. –
那么,那会给我带来两个A元素,我必须弄清楚每种...现在我想知道,如果A具有ID,因为它不会为B对象带来A-only字段,还是会直接执行'A object1 = new B()'?现在你提到它了......我觉得我在这里是一种“过度防御”...... – Gamb
这两个字段的类型都是IA,所以你不知道它是哪种类型(A或B)。 B扩展了A,所以B **是** A.虽然变量的类型是IA,但是对象的实际类型可以是A或B.Hibernate将填充具有适当具体类型的实例的引用all通过它自己。 –