JPA 继承方式

    在JPA中,实体继承关系的映射策略共有三种:单表继承策略(table per class)、Joined策略(table per subclass)和Table_PER_Class策略。

 

1.单表继承策略

   

    单表继承策略,父类实体和子类实体共用一张数据库表,在表中通过一列辨别字段来区别不同类别的实体。具体做法如下:

a.在父类实体的@Entity注解下添加如下的注解:

@Inheritance(Strategy=InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name=”辨别字段列名”)
@DiscriminatorValue(父类实体辨别字段列值)

 

b.在子类实体的@Entity注解下添加如下的注解:

@DiscriminatorValue(子类实体辨别字段列值) 

 

 

定义了一个父类

Java代码   收藏代码
  1. @Entity  
  2. @Inheritance(strategy = InheritanceType.SINGLE_TABLE)  
  3. @Table(name = "WINDOW_FILE")  
  4. @DiscriminatorColumn(name = "DISCRIMINATOR", discriminatorType = DiscriminatorType.STRING, length = 30)  
  5. @DiscriminatorValue("WindowFile")  
  6. public class WindowFile {  
  7.   
  8.     @Id  
  9.     @GeneratedValue(strategy = GenerationType.AUTO)  
  10.     private Integer id;  
  11.   
  12.     @Basic  
  13.     @Column(name = "NAME")  
  14.     private String name;  
  15.   
  16.     @Basic  
  17.     @Column(name = "TYPE")  
  18.     private String type;  
  19.   
  20.     @Basic  
  21.     @Column(name = "DATE")  
  22.     private Date date;  
  23.     //省略get set  
  24. }  

 

后定义2个子类

 

Java代码   收藏代码
  1. @Entity  
  2. @DiscriminatorValue("Folder")  
  3. public class Folder extends WindowFile {  
  4.   
  5.     @Basic  
  6.     @Column(name = "FILE_COUNT")  
  7.     private Integer fileCount;  
  8.     //省略get set  
  9. }  

 

Java代码   收藏代码
  1. @Entity  
  2. @DiscriminatorValue("Document")  
  3. public class Document extends WindowFile {  
  4.   
  5.     @Basic  
  6.     @Column(name = "SIZE")  
  7.     private String size;  
  8.     //省略get set  
  9. }  

 

 以上通过列DISCRIMINATOR的不同,区分具体父子实体。

 

实际表结构如下:

WINDOW_FILE  DISCRIMINATOR,ID,NAME,DATE,TYPE,SIZE,FILE_COUNT

 

当你使用WindowFile实体时,实际表的字段为DISCRIMINATOR='WindowFile',SIZE与FILE_COUNT永远是空

当使用Folder实体时,DISCRIMINATOR='Folder',SIZE永远是空,FILE_COUNT为实际值。

Document同理,与Folder类似。

 

2.Joined策略

 

    父类实体和子类实体分别对应数据库中不同的表,子类实体的表中只存在其扩展的特殊属性,父类的公共属性保存在父类实体映射表中。具体做法:

 

 

 

@Inheritance(Strategy=InheritanceType.JOINED)

 

子类实体不需要特殊说明。

 

 

Java代码   收藏代码
  1. @Entity  
  2. @Table(name = "T_ANIMAL")  
  3. @Inheritance(strategy = InheritanceType.JOINED)  
  4. public class Animal {  
  5.   
  6.     @Id  
  7.     @Column(name = "ID")  
  8.     @GeneratedValue(strategy = GenerationType.AUTO)  
  9.     private Integer id;  
  10.   
  11.     @Column(name = "NAME")  
  12.     private String name;  
  13.   
  14.     @Column(name = "COLOR")  
  15.     private String color;  
  16.     //省略get set  
  17. }  

 

Java代码   收藏代码
  1. @Entity  
  2. @Table(name = "T_BIRD")  
  3. @PrimaryKeyJoinColumn(name = "BIRD_ID")  
  4. public class Bird extends Animal {  
  5.   
  6.     @Column(name = "SPEED")  
  7.     private String speed;  
  8.     //省略get set  
  9. }  

 

Java代码   收藏代码
  1. @Entity  
  2. @Table(name = "T_DOG")  
  3. @PrimaryKeyJoinColumn(name = "DOG_ID")  
  4. public class Dog extends Animal {  
  5.   
  6.     @Column(name = "LEGS")  
  7.     private Integer legs;  
  8.     //省略get set  
  9. }  

 

 

实际表结构如下:

T_ANIMAL  ID,COLOR,NAME

T_BIRD  SPEED,BIRD(既是外键,也是主键)

T_DOG  LEGS,DOG_ID(既是外键,也是主键)

 

3.Table_PER_Class策略:

 

Table_PER_Class策略,父类实体和子类实体每个类分别对应一张数据库中的表,子类表中保存所有属性,包括从父类实体中继承的属性。具体做法:

只需在父类实体的@Entity注解下添加如下注解:

@Inheritance(Strategy=InheritanceType.TABLE_PER_CLASS)

 

Java代码   收藏代码
  1. @Entity  
  2. @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)  
  3. @Table(name = "T_VEHICLE")  
  4. public class Vehicle { // 基类  
  5.   
  6.     @Id  
  7.     // @GeneratedValue  
  8.     @Column(name = "ID")  
  9.     private Integer id;  
  10.   
  11.     @Column(name = "SPEED")  
  12.     private Integer speed;// 速度  
  13.     //省略get set  
  14. }  

 

Java代码   收藏代码
  1. @Entity  
  2. @Table(name = "T_CAR")  
  3. public class Car extends Vehicle {  
  4.   
  5.     @Column(name = "ENGINE")  
  6.     private String engine;// 发动机  
  7.     //省略get set  
  8. }  

 

一旦使用这种策略就意味着你不能使用AUTO generator 和IDENTITY generator,即主键值不能采用数据库自动生成。

 

实际表结构如下:

T_VEHICLE  ID,SPEED

T_CAR  ID,SPEED,ENGINE

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JPA(Java Persistence API)是Java EE 5规范中定义的一套持久化框架,用于将Java对象映射到关系型数据库中,并提供了一系列的API来管理数据的持久化和访问。JPA的使用方式和语法如下: 1. 定义实体类:使用@Entity注解标注Java中的实体类,并使用@Id注解标注实体类中的主键字段。 ```java @Entity public class User { @Id private Long id; private String name; private Integer age; //...省略getter和setter方法 } ``` 2. 定义Repository接口:使用@Repository注解标注Java中的Repository接口,并继承JpaRepository或其它相关的接口。在接口中定义数据库操作方法,方法名遵循JPA的命名规范。 ```java @Repository public interface UserRepository extends JpaRepository<User, Long> { //根据名称查询用户 User findByName(String name); //根据名称和年龄查询用户 User findByNameAndAge(String name, Integer age); //根据名称模糊查询用户 List<User> findByNameLike(String name); } ``` 3. 配置数据源和JPA相关的属性:在application.properties或application.yml文件中配置数据源和JPA相关的属性,如数据库连接信息、JPA实现类等。 ``` spring.datasource.url=jdbc:mysql://localhost:3306/test spring.datasource.username=root spring.datasource.password=root spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect ``` 4. 使用EntityManager进行操作:除了使用Repository接口进行数据库操作外,也可以使用EntityManager进行操作。EntityManager是JPA中的核心API,用于管理实体对象的生命周期和数据的持久化。 ```java @Autowired private EntityManager entityManager; public void save(User user) { entityManager.persist(user); } public User findById(Long id) { return entityManager.find(User.class, id); } public void delete(User user) { entityManager.remove(user); } ``` 以上是JPA的基本使用方式和语法,JPA还提供了一系列的高级特性,如事务管理、关联关系的管理、动态查询等,需要根据具体的需求来选择使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值