【发布时间】:2012-11-23 17:29:40
【问题描述】:
我在一个已经成熟的项目中工作,所以我无法更改任何使用的框架或库的任何版本。
实际上,我有一个特殊情况,我设法通过两个实体和@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(metaColumn=@Column(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 中失去了一些我还不知道的特定功能,所以我目前愿意接受并感谢任何可能为我指明正确方向的建议。
【问题讨论】:
-
为什么首先需要 Any?对 A 的引用可以指向 B 而无需做任何事情,因为 B 扩展了 A。
-
嗯,这会给我留下两个 A 元素,我必须弄清楚每种元素......现在我想知道,如果 A 有 ID,那么它不会带来 A - 仅用于 B 对象的字段,还是直接使用
A object1 = new B()?既然你提到它......我觉得我在这里有点“过度防守”...... -
这两个字段的类型都是IA,所以你也不知道是什么类型(A还是B)。 B 扩展了 A,所以 B is 是 A。虽然变量的类型是 IA,但对象的实际类型可能是 A 或 B。Hibernate 会用适当的实例填充引用具体类型本身。
-
晶莹剔透,谢谢。愿意将其发布为答案吗?这就是我的目标。