实体继承

时间:2015-12-26 06:29:23

标签: java jpa inheritance entity

我有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;
}

我希望有一个C实体类,它具有所有A和B属性(a1,b1和C的属性c1)。

@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 gerenartion策略(错误:不能使用身份列密钥生成)。也是序列策略  影响性能和并发性。

如何拥有一个具有所有A和B属性(a1,b1和C的属性c1)的C实体类,没有上述问题?

1 个答案:

答案 0 :(得分:0)

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

  1. TABLE_PER_CLASS 策略,当您需要查询B时,您应该使用select * from B b where TYPE(b) IN (B),在这种情况下,JPA不会使用与C的联合。

    < / LI>
  2. SINGLE_TABLE 策略,在这种情况下,您应该定义“鉴别器列”,例如mytype,其值为“B”或“C”,您可以使用查询select * from B where mytype = 'B'select * from C where mytype = 'C'。减去B和C在一个表中,B具有始终为NULL的字段c1