JPA关系和多态性

时间:2010-11-16 11:35:05

标签: java jpa polymorphism

我有以下类结构(为清楚起见,省略了细节):

例如:

@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是多晶型物。

2 个答案:

答案 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