我有以下
@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类型)。映射应该是什么?
答案 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自动填充。