0

我有以下

@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 类型)。映射应该是什么?

4

3 回答 3

1

如果你A从另一个实体引用一个,那么A不应该是一个 MappedSuperclass,而是一个实体。你应该用 注释它@Entity,并选择一个继承策略

除此之外,映射将保持原样。

于 2013-01-09T19:56:42.600 回答
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

于 2013-01-10T14:13:18.370 回答
0

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

于 2013-01-09T17:58:00.983 回答