欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JPA实体继承的映射

程序员文章站 2022-04-23 11:58:27
...

JPA实体继承的映射

1、父类只存在实体公共字段查询

@MappedSuperclass
public class Model implements Serializable{
    private Date createdAt;
    private Date updatedAt;

    //省略getter、setter
}
@Entity
@IdClass(value = PartyPK.class)
@Table(name = "account")
public class Account extends Model{
    @Id
    private String partyId;
    @Id
    private String accountTypeId;

    @OneToOne
    @JoinColumn(name = "account_type_id",insertable = false,updatable = false)
    private AccountType accountType;

    private String account;
    private String password;
    private String passwordSalt;
    private String headImage;

     //省略getter、setter
}

2、实体继承实体

        继承映射使用@Inheritance来注解,它的strategy属性的取值由枚举InheritanceType来定义(包括SINGLE_TABLE、TABLE_PER_CLASS、JOINED,分别对应三种继承策略)。@Inheritance注解只能作用于继承结构的超类上。如果不指定继承策略,默认使用SINGLE_TABLE。

JPA提供了三种继承映射策略:
        ①、 一个类继承结构一个表的策略。这是继承映射的默认策略。即如果实体类B继承实体类A,实体类C也继承自实体A,那么只会映射成一个表,这个表中包括了实体类A、B、C中所有的字段,JPA使用一个叫做“discriminator列”来区分某一行数据是应该映射成哪个实体。注解为:@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
        ②、 联合子类策略。这种情况下子类的字段被映射到各自的表中,这些字段包括父类中的字段,并执行一个join操作来实例化子类。注解为:@Inheritance(strategy = InheritanceType.JOINED)
        ③、 每个具体的类一个表的策略。注解为:@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)

@Entity  
@Table(name = "model")  
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)  
@DiscriminatorColumn(name = "model_type")  
public class Model implements Serializable {  
  
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    protected Integer id;  
       
    protected String name;  
  
    //省略 getter、setter  
      
}
@Entity  
@DiscriminatorValue("test1")  
public class Test extends Model{  
   
    private String age;  
  
    //省略getter、setter
      
} 

其他策略、说明参考:http://*.com/questions/916169/cannot-use-identity-column-key-generation-with-union-subclass-table-per-clas

转载于:https://my.oschina.net/cxlt216/blog/756779