`
微Smile
  • 浏览: 34862 次
  • 性别: Icon_minigender_2
  • 来自: 湖南
社区版块
存档分类
最新评论

hibernate entity 继承映射策略与Mapped SupperClass

    博客分类:
  • java
 
阅读更多

部分内容来自:http://blog.csdn.net/mhmyqn/article/details/37996673

 

JPA实体继承实体的映射策略

 

三种:SINGLE_TABLE(默认的)、TABLE_PER_CLASS、JOINED

 

SINGLE_TABLE: 父子类Entity字段写入同一张表

 

@Entity  
@Table(name = "EMP")  
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)  
@DiscriminatorColumn(name = "emp_type")  
public class Employee implements Serializable {  
  
    private static final long serialVersionUID = -7674269980281525370L;  
      
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    protected Integer empId;  
      
    @Column  
    protected String name;  
  
    // getter/setter方法  
      
}  

@Entity  
@DiscriminatorValue("FT")  
public class FullTimeEmployee extends Employee {  

    @Column  
    private Double salary;  
    // getter/setter方法  
      
}

@Entity  
@DiscriminatorValue("PT")  
public class PartTimeEmployee extends Employee { 

    @Column(name = "hourly_wage")  
    private Float hourlyWage;  
  
    // getter/setter方法  
  
} 

 结论: 只会生成一个表,包含了字段emp_type、empId、name、salary、hourly_wage。当保存FullTimeEmployee时,emp_type的值为“FT”, 当保存PartTimeEmployee时,emp_type的值为“PT”。

 

注:DiscriminatorColumn可对应表中的某一个列(emp_type)来区别记录是由那个子类生成。

 

 

 缺点:子类字段对应的列必须允许null.

 

TABLE_PER_CLASS : 父类子类各自生成一张表,子类只继承父类主键作为自己的主键,不继承其他属性。且子类插入数据与父类无关。

 

 

 

@Entity  
@Table(name = "EMP")  
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)  
public class Employee implements Serializable {  
  
    private static final long serialVersionUID = -7674269980281525370L;  
      
    @Id  
    @GeneratedValue(strategy = GenerationType.TABLE)  
    protected Integer empId;  
      
    @Column  
    protected String name;  
  
    // getter/setter方法  
      
}  
  
@Entity  
@Table(name = "FT_EMP")  
public class FullTimeEmployee extends Employee {  
  
    private static final long serialVersionUID = 9115429216382631425L;  
  
    @Column  
    private Double salary;  
  
    // getter/setter方法  
      
}  
@Entity  
@Table(name = "PT_EMP")  
public class PartTimeEmployee extends Employee {  
  
    private static final long serialVersionUID = -6122347374515830424L;  
  
    @Column(name = "hourly_wage")  
    private Float hourlyWage;  
  
    // getter/setter方法  
  
} 

 

 

结论: 这会映射成三个具体的表,分别是,Employee对应EMP表,字段包括empId、name;FullTimeEmployee对应FT_EMP表,字段包括empId、salary;PartTimeEmployee对应PT_EMP表,字段包括empId、hourly_wage。其中,表FT_EMP和PT_EMP中的empId和EMP表的empId没有任何关系。子类实体每保存一条数据,EMP表中不会插入记录。

 

注意:

1 table_per_class的表生成策略,只有在抽象类不会在其他实体的代码中被引用的时候才适用。

如:

@Entity  
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)  //报错,无法运行,若改为JOINED策略才可
public abstract class Human implements Serializable {  
    private static final long serialVersionUID = 1856374544815477685L;  
        //..........................................  
}  

@Entity  
@Table(name="EMPLOYEE_INFO")  
public class Employee extends Human {  
     //...............................  
} 

@Entity  
public class Award implements Serializable {  
    @ManyToOne  
    private Human publisher;  
}  

2 主键的生成策略不能使用GenerationType.AUTO或GenerationType.IDENTITY,否则会出现异常:

org.hibernate.MappingException: Cannot use identity column key generation with <union-subclass> mapping for: com.mikan.PartTimeEmployee

因为TABLE_PER_CLASS策略每个表都是单独的,没有并且各表的主键没有任何关系,所以不能使用GenerationType.AUTO或GenerationType.IDENTITY主键生成策略,可以使用GenerationType.TABLE。

 

JOINED: 子类父类各自生成表,子类只继承父类的主键作为自己的主键,父类对应表的外键。子类插入数据与父类有关

 

 

@Entity  
@Table(name = "EMP")  
@Inheritance(strategy = InheritanceType.JOINED)  
public class Employee implements Serializable {  
  
    private static final long serialVersionUID = -7674269980281525370L;  
      
    @Id  
    @GeneratedValue(strategy = GenerationType.IDENTITY)  
    protected Integer empId;  
      
    @Column  
    protected String name;  
  
    // getter/setter方法  
      
}  
  
@Entity  
@Table(name = "FT_EMP")  
public class FullTimeEmployee extends Employee {  
  
    private static final long serialVersionUID = 9115429216382631425L;  
  
    @Column  
    private Double salary;  
  
    // getter/setter方法  
      
} 
@Entity  
@Table(name = "PT_EMP")  
public class PartTimeEmployee extends Employee {  
  
    private static final long serialVersionUID = -6122347374515830424L;  
  
    @Column(name = "hourly_wage")  
    private Float hourlyWage;  
  
    // getter/setter方法  
  
}  

 

 

结论: 这会映射成三个具体的表,分别是,Employee对应EMP表,字段包括empId、name;FullTimeEmployee对应FT_EMP表,字段包括empId、salary;PartTimeEmployee对应PT_EMP表,字段包括empId、hourly_wage。其中,表FT_EMP和PT_EMP中的empId作为表EMP的外键,同是它也是主键。默认情况下,使用超类的主键作为子类的主键和外键。当然,可以通过@PrimaryKeyJoinColumn注解来自己指定外键的名称,如FullTimeEmployee使用@PrimaryKeyJoinColumn(name = "FT_EMPID")注解,那么该子类实体的字段为FT_EMPID、name,FT_EMPID作为表FT_TIME的主键,同时它也是EMP表的外键。

子类实体每保存一条数据,会在EMP表中插入一条记录,如FT_EMP表插入一条数据,会先在EMP表中插入name,并生成empId,再在FT_EMP表中插入empId和salary。PT_EMP同理。
不管超类是抽象类还是具体类,都会生成对应的表。

 

Mapped SupperClass:父类不对应表,子类继承父类的所有属性生成自己的表。且不能对父类进行查询等操作(因为不对应表)

如:

@MappedSuperclass 
 public class Employee { 
    @Id 
    @GeneratedValue 
    private Long id; 
    private String name; 
    private String depart; 

    // Getters and Setters 
 
 }
 @Entity 
 public class Manager extends Employee { 
     private String office; 
     private String car; 

   // Getters and Setters 
 }

 结论:生成子类对应的表结构:

 CREATE TABLE `manager` ( 

  `ID` bigint(20) NOT NULL, 

  `OFFICE` varchar(255) default NULL, 

  `CAR` varchar(255) default NULL, 

  `DEPART` varchar(255) default NULL, 

  `NAME` varchar(255) default NULL, 

  PRIMARY KEY  (`ID`) 

 

 ) ENGINE=InnoDB DEFAULT CHARSET=latin1;

 

 

 

分享到:
评论

相关推荐

    Hibernate继承映射的第一种策略:每棵类继承树对应一张表

    Hibernate继承映射是将Java类的继承关系映射到数据库表的一种策略,使得对象模型的复杂性能够平滑地转化为关系数据库模型。本篇将详细介绍Hibernate继承映射的第一种策略——每棵类继承树对应一张表,即单一表继承...

    Hibernate继承映射-概述

    Hibernate提供了三种继承映射策略: 1. **单表继承(Single Table Inheritance)**:所有子类的实例数据都存储在同一个数据库表中,通过一个特定的字段(通常是`discriminator`字段)来区分不同子类的对象。 2. **...

    Hibernate继承映射(annotation)

    Hibernate支持多种继承映射策略,包括: 1. **单表继承(Single Table Inheritance)**:所有的子类信息存储在同一个表中,通过一个特定的字段来区分不同的子类。 2. **类表继承(Class Table Inheritance)**:每...

    JAVA数据类型与Hibernate的类型映射

    而在Java持久化框架Hibernate中,这些数据类型需要与数据库中的字段类型进行映射,以便正确地存储和检索数据。这篇博客主要探讨了Java数据类型如何与Hibernate的类型映射进行对应。 首先,Java的基本数据类型在...

    hibernate 映射继承 demo

    Hibernate支持四种继承映射策略:单表继承(Single Table Inheritance)、联合继承( Joined Subclass)、表 per 类继承(Table per Class Inheritance)和子类表(Concrete Table Inheritance)。在实际应用中,最...

    Hibernate继承映射一:每个类分层结构一张表

    本篇文章主要探讨的是Hibernate的继承映射策略,特别是“每个类分层结构一张表”(Table per Concrete Class)的方式。这种映射策略是Hibernate提供的多种继承映射方案之一,适用于处理复杂的对象模型。 首先,我们...

    hibernate映射继承关系(每个类都对应一张表)

    总结起来,"每个类都对应一张表"的继承映射策略在Hibernate中是一种直接且易于理解的方法,适合那些每个类都有独特属性的情况。然而,它可能不适合所有场景,特别是当子类众多或者需要减少数据冗余时。在实际应用中...

    hibernate set 集合映射

    在Java的持久化框架Hibernate中,集合映射是将数据库中的表关系映射到对象模型中的集合类,如List、Set、Map等。这允许我们在Java代码中操作对象集合,而Hibernate负责处理底层的SQL查询和数据存储。本文将深入探讨`...

    Hibernate 注解映射

    Hibernate 注解映射 Hibernate 注解映射是 Hibernate 框架中的一种映射方式,它使用 Java 注解来描述实体类和数据库表之间的映射关系,提高开发效率。 一、 环境搭建和基本映射 在使用 Hibernate 注解映射之前,...

    hibernate多对多关联映射

    在Java的持久化框架Hibernate中,多对多关联映射是一种常见的关系数据库模型映射方式,用于处理两个实体之间存在多个实例互相关联的情况。本文将深入探讨Hibernate如何实现多对多关联映射,并通过实际例子解析相关...

    Hibernate教程09_关系映射之组件映射

    组件映射是Hibernate中的一种高级映射策略,用于将一个类的属性组织成一个逻辑组件,这个组件可以有自己的持久化属性。 首先,我们需要理解什么是组件(Component)。在Hibernate中,组件通常是一个没有独立生命...

    hibernate映射和查询

    **hibernate映射与查询** Hibernate 是一个流行的 Java 应用程序开发框架,它提供了一个持久层解决方案,简化了数据库操作。对于初学者来说,理解 Hibernate 的映射和查询机制是至关重要的,因为它们构成了 ...

    Hibernate 映射文件自动生成

    Hibernate通过XML或注解方式将Java类与数据库表进行映射,使得开发者可以使用面向对象的方式来处理数据库。然而,手动编写这些映射文件可能会耗费大量时间,因此“Hibernate 映射文件自动生成”是一个非常实用的功能...

    Hibernate实体映射

    例如,`@Entity`注解标识一个类为Hibernate实体,`@Table`指定对应的数据库表名,`@Id`标记主键字段,`@GeneratedValue`定义主键生成策略等。此外,`@Column`用于指定列名和类型,`@ManyToOne`、`@OneToMany`、`@...

    hibernate复合主键映射

    一旦完成,Hibernate就可以通过这个复合主键模型与数据库进行交互了。 总之,Hibernate通过`@Embeddable`和`@EmbeddedId`注解支持复合主键的映射,允许开发者根据业务需求灵活地设计数据模型。理解并掌握这一特性,...

    Hibernate初之单表映射学习例子

    4. **XML映射文件**:解释Hibernate的Hibernate Configuration File (hbm.xml)和Entity Mapping File (hbm.xml),它们描述了实体类和数据库表之间的映射关系。 5. **SessionFactory和Session**:描述SessionFactory...

Global site tag (gtag.js) - Google Analytics