【问题标题】:Entity Inheritance实体继承
【发布时间】: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


【解决方案1】:

您可以根据自己的情况使用:

  1. TABLE_PER_CLASS策略,当需要查询B时,应该使用select * from B b where TYPE(b) IN (B),这种情况下JPA不能和C使用union。

  2. SINGLE_TABLE 策略,在这种情况下你应该定义“鉴别列”,例如mytype,它的值为'B'或'C',你可以使用查询@ 987654323@ 或select * from C where mytype = 'C'。减去 B 和 C 在一个表中,并且 B 的字段 c1 始终为 NULL。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-19
    • 2010-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多