【发布时间】:2016-03-31 20:39:12
【问题描述】:
我有2个A类和B类:
@MappedSuperclass
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class A {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
public long id;
private a1;
}
@Entity
public class B extends A {
private b1;
}
我想要一个具有所有 A 和 B 属性(a1、b1 和 C 的属性 c1)的 C 实体类。
@Entity
public class C extends B {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private c1;
}
1- 当我使用继承策略 InheritanceType.JOINED 时,它不会将 A 和 B 的属性复制到 C 中,结果,表 A、B 和 C 将在查询时加入!
2- 如果我使用继承策略 InheritanceType.TABLE_PER_CLASS ,它会将 A 和 B 的属性复制到 C 中,但是当我要查询 B 时,它将使用 UNION 和 C! 它也不允许 AUTO ID 生成策略(错误:无法使用标识列密钥生成)。还有顺序策略 影响性能和并发性。
我怎样才能拥有一个具有所有 A 和 B 属性(a1、b1 和 C 的属性 c1)的 C 实体类,而没有上述问题?
【问题讨论】:
-
你有什么问题?
-
我想要一个C实体类,它具有所有A和B属性(a1,b1和C的属性c1),没有上面提到的问题!
-
如果您确实有问题(后面有 ?),请编辑您的帖子以包含该问题。不要使用 cmets!
-
如果 C 扩展了 B,那么您不能在子类中重新定义 Id。无论您使用什么继承策略,情况都是如此。任何 JPA 文档都会告诉你这一点
-
首先,A必须用Entity注解,而不是MappedSuperclass。第二, id 不能在 C 中重新定义。第三,你不要继承一个类,因为你想拥有相同的属性。你这样做是因为存在 is a 关系。如果 C 不是 B,那么 C 不应该继承 B,即使它恰好具有相似的字段。 B 和 C 之间的联合是因为你说 JPA 说 C 是 B。如果你的问题是性能,那么你不应该担心序列生成(这绝对没问题),你最好使用第三个和默认策略:单表。
标签: java jpa inheritance entity