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的外键,同是它也是主键。默认情况下,使用超类的主键作为子类的主键和外键。当然,[email protected]�称,如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支持四种继承映射策略:单表继承(Single Table Inheritance)、联合继承( Joined Subclass)、表 per 类继承(Table per Class Inheritance)和子类表(Concrete Table Inheritance)。在实际应用中,最...
在Hibernate 3.2中,类继承有多种策略,包括单表继承(Single Table Inheritance)、联合继承(Joined Table Inheritance)和Concrete Table Inheritance。这些策略各有优缺点,适用于不同的场景。 1. 单表继承...
Hibernate,作为Java中广泛使用的对象关系映射(ORM)框架,提供了多种方式来处理继承关系的映射,其中一种就是"每个类都对应一张表"的策略。本文将深入探讨这种映射方式,以及如何在Hibernate中实现它。 首先,...
总结来说,Hibernate Tools是提高开发效率的强大工具,它帮助开发者快速创建与数据库表对应的Entity Bean,减少了手动编写大量重复代码的工作量。通过理解这个过程,你可以更好地掌握Hibernate框架,并有效地应用到...
### Hibernate继承策略 Hibernate支持多种继承映射策略,包括: 1. **单表继承(Single Table Inheritance)**:所有的子类信息存储在同一个表中,通过一个特定的字段来区分不同的子类。 2. **类表继承(Class ...
Hibernate提供了三种继承映射策略: 1. **单表继承(Single Table Inheritance)**:所有子类的实例数据都存储在同一个数据库表中,通过一个特定的字段(通常是`discriminator`字段)来区分不同子类的对象。 2. **...
本篇文章将详细阐述Hibernate中的三种实体继承策略:单表继承(Single Table)、类表继承(Table Per Class)和联合继承( Joined Subclass)。 1. 单表继承(Single Table) 单表继承策略,如其名,意味着所有继承...
而Hibernate Entity Manager是符合JPA规范的实现,它提供了JPA接口的完整实现,并且继承了Hibernate自身的特性,如二级缓存、 Criteria查询等,使得开发者既能享受到标准API的便利,也能利用到Hibernate的高效性能。...
本篇文章主要探讨的是Hibernate的继承映射策略,特别是“每个类分层结构一张表”(Table per Concrete Class)的方式。这种映射策略是Hibernate提供的多种继承映射方案之一,适用于处理复杂的对象模型。 首先,我们...
Hibernate Entity Manager作为JPA的实现,允许开发者使用面向对象的方式处理数据库操作,从而降低了与数据库交互的复杂性。3.2.1.GA版本是该组件的一个稳定发布,包含了对JPA规范的全面支持以及对各种数据库系统的...
在Java的持久化框架Hibernate中,懒加载(Lazy Loading)是一种重要的对象关系映射策略,用于提高应用程序的性能。懒加载的基本思想是延迟加载,即当真正需要数据时,才去数据库加载。在这个场景中,我们关注的是...
【标题】"hibernate-entitymanager-3.4.0.GA" 是一个与Java持久化框架Hibernate Entity Manager相关的库,这个版本号表明它是2009年左右发布的一个稳定版本。Hibernate Entity Manager是JPA(Java Persistence API)...
Hibernate Entity Manager,是Hibernate框架中的一个关键组件,专为Java应用程序提供ORM(对象关系映射)解决方案。在本篇文章中,我们将深入探讨Hibernate Entity Manager 3.3.2.CR1这一特定版本,以及它在Java开发...
本篇文章将详细讲解如何使用Hibernate3在MyEclipse环境中自动生成实体类(Entity)以及相关的映射文件,从而快速构建数据访问层。 首先,我们需要创建一个新的Web工程。在MyEclipse中,通过File > New > Dynamic ...