我有以下类结构(为清楚起见,省略了细节):
例如:
@Entity
class A{
@OneToMany
private List<B> b;
@OneToOne
private C c;
}
interface B {
}
@Entity
@Inheritance
abstract class Babstract implements B {
}
@Entity
@PrimaryKeyJoinColumn
class B1impl extends Babstract {
}
@Entity
@PrimaryKeyJoinColumn
class B2Impl extends Babstract {
}
我想加载属于C的所有B.A类将B与C相关联.B和C不知道彼此存在,我喜欢这样保持它。我不知道B的实际实现类型,我并不在乎,因为我使用抽象数据类型B(接口)。实施可能会随着时间的推移而变化,例如,未来可能会在新版本中添加新的B实施。
这可能与JPA有关,我该怎么做?我不能使用targetEntity属性,如果我是正确的,因为我不知道实现类,我不在乎。 B是多晶型物。
答案 0 :(得分:1)
JPA无法很好地使用接口。您需要使用实体注释使B至少成为一个抽象类。你可以使B成为一个完全空的抽象类(除了id字段,你需要它),然后添加继承。这样做的原因是,为了使实体能够引用另一个实体,必须有一种方法可以在数据库中引用该实体 - 如果没有B表,那么就没有办法做到这一点。 / p>
答案 1 :(得分:1)
JPA没有接口支持,但有些JPA提供程序支持。如果使用EclipseLink,您可以使用@VariableOneToOne映射映射到接口。
现在,如果B接口只有一个当前的实现者,而这只是“未来的某个可能时间”,那么我只需将targetEntity设置为Babstract。如果“将来某些可能的时间”确实发生(可能不会),那么您可以更改映射。
请参阅, http://en.wikibooks.org/wiki/Java_Persistence/Advanced_Topics#Interfaces