JPA ManyToOne用于类层次结构

时间:2013-01-09 17:47:07

标签: java jpa

我有以下

@MappedSuperclass
public abstract class A {
    @Id @GeneratedValue
    public Long id;
}

@Entity
public class B extends A {
}

@Entity
public class C extends A {
}

@Entity
public class D {
    @ManyToOne
    public A a;
}

问题是D类和字段a(可以是B或C类型)。映射应该是什么?

3 个答案:

答案 0 :(得分:1)

如果您从其他实体引用A,那么A不应该是MappedSuperclass,而应该是实体。您应该使用@Entity对其进行注释,然后选择inheritance strategy

除此之外,映射将保持不变。

答案 1 :(得分:1)

这在JPA中无效,因为无法将关系定义为@MappedSuperclass。

您可以映射A和@Entity(TABLE_PER_CLASS继承会为您提供相同的数据模型,但也会考虑JOINED或SINGLE_TABLE,因为它们通常更有效)。

在EclipseLink中,您还可以将@VariableOneToOne用于此类关系。

请参阅, http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/a_variableonetoone.htm#CHDDFDGF

答案 2 :(得分:0)

你在做什么是正确的。它将是映射A.因此,在表D中;我们将有一个额外的列,告诉我们A是B还是C.在Toplink中,我们将列名称作为Type。即使在休眠状态下,我们也有类似的概念。此列由ORM自动填充。