部分内容来自:http://blog.csdn.net/mhmyqn/article/details/37996673
三种: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;
相关推荐
轻量级javaee 企业应用于实践 有专业教授现场演示 内容和清晰 态度亲切 不可或缺
Hibernate Annotation几种关联映射 一对一(One-To-One) 使用@OneToOne注解建立实体Bean之间的一对一关联。一对一关联有三种情况:(1).关联的实体都共享同样的主键,(2).其中一个实体通过外键关联到另一个实体的主键...
3、如果要使用EntityFramework还需要JetEntityFrameworkProvider,这是第三方github提供的软件,在NuGet上也提供了,不过它仅支持32位的,如果想要使用64位的,可以下载源码重新编译dll。 4、上面说的accessdatabase...
hibernate自动生成entity,映射文件,dao.等
hibernate_tools-entity实体、dao、hbm等代码生成
String str = "import javax.persistence.Entity;\n" + "import javax.persistence.Id;\n" + "import javax.persistence.Table;\n" + "import java.util.Calendar;\n\n"; str += "@Entity\n"; str += "@Table...
自己根据课本总结的使用hibernate时,实体类间映射文件即*.hbm.xml文件的写法。如果你正在学习hibernate,保证会对你有所帮助。
无法带图发表,请下载附件的word文档,里边有详细的截图! 博文链接:https://hanyou.iteye.com/blog/134799
2.4.3 Hibernate映射类型接口 2.4.4 可供扩展的接口 2.5 小结 2.6 思考题 第3章 第一个Hibernate应用 3.1 创建Hibernate的配置文件 3.2 创建持久化类 3.3 创建数据库Schema 3.4 创建对象-关系映射...
Hibernate 是一个开源的O/R mappimg的框架,基于JDBC提供了一种持久性数据管理的方案,相对于EntityBean来说是相当轻量级的。由于Hibernate是基于 JDBC的,所以它的数据库查寻的能力相对于CMP来说也是异常强大的,...
freebase的实体id到真实实体的映射 数据集
Hibernate逆向生成entity和hbm.xml文件这是一个视频,比文件看起来更加给力。
• Joined Subclass Strategy: the <joined-subclass> element in Hibernate 连接的子类策略 @Inheritance 注解来定义所选的之类策略。 每个类一张表 @Entity @Inheritance(strategy = InheritanceType.TABLE_PER...
9.1. 继承映射特性(Features of inheritance mappings) 16.1. 别名注射(alias injection names) 19.1. 缓存策略提供商(Cache Providers) 19.2. 各种缓存提供商对缓存并发策略的支持情况(Cache Concurrency ...
用MyEclipse自动生成Hibernate映射文件和实体,图解
资源很好,很实用,代码少简单易懂,很随时用在项目中,并且使用的效果也很好!
9.1. 继承映射特性(Features of inheritance mappings) 16.1. 别名注射(alias injection names) 19.1. 缓存策略提供商(Cache Providers) 19.2. 各种缓存提供商对缓存并发策略的支持情况(Cache Concurrency ...
9.1. 继承映射特性(Features of inheritance mappings) 16.1. 别名注射(alias injection names) 19.1. 缓存策略提供商(Cache Providers) 19.2. 各种缓存提供商对缓存并发策略的支持情况(Cache Concurrency ...
hibernate 注释包以及枚举映射包