我正在一个已经长大的项目中工作,所以我将无法更改任何使用过的框架或库的任何版本。
实际上,我遇到了一个特殊情况,我设法解决了两个实体@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中失去了一些我还不知道的特殊功能,所以我现在愿意并且感谢任何可能使我指向正确方向的建议。
答案 0 :(得分:2)
您不需要任何@Any
注释。 B扩展A,所以B is
和A.所以以下就足够了:
public class Container {
@ManyToOne
private A object1;
@ManyToOne
private A object2;
}
(假设该关联是ManyToOne。它也可能是OneToOne)
Hibernate将自己弄清楚两个对象的具体类型,并使用A或B的实例初始化object1和object2。