具有继承关系的实体类的映射的表现有四种方法:
1)每个带有隐式多态的而具体类一张表---使用非显示的继承映射和默认的运行时多态行为
即每个子类一张表,并且父类的所有属性在每个子类里面都有对应列。
主要问题在于,不太支持多态关联。还有就是多态查询。针对基类的查询必须作为几个SQL SELECT执行,每个具体子类一个。
XML描述符中,Hibernate没有什么特殊设置,就像每个子类和一般的实体类没区别一样设置。
对应的JPA:基类用@MappedSuperclass注解;可以为抽象类
具体子类可以用@AttributeOverride注解来覆盖来自超类的列映射。
XML描述符中,有<mapped-superclass class="......" access="FIELD">....</mapped-superclass>
2)每个具体类一张表.
和1)一样,每个具体子类有一张表,但是它们的配置文件不一样
Hibernate:用<union-subclass>继承策略
<class name="baseClass" abstract="true"><id ....></id><property..../>
<union-subclass name="sub-classA" table="A">....</union-subclass>
<union-subclass name="sub-classB" table="B">....</union-subclass>
</class>
JPA注解中,这个策略称作TABLE_PER_CLASS
数据库标识符和它的映射必须出现在超类中,在所有子类和它们的表中共享。
XML描述符中
<entity class="baseClass" access="FIELD">
<inheritance strategy="TABLE_PER_CLASS"/>
......
</entity>
<entity class="sub-classA" access="FIELD"/>
<entity class="sub-classB" access="FIELD"/>
如果超类是具体的,则需要另外一张表来存放这个类的实例。
对多台查询很有好处,如查找baseClass,它会把sub-classA和sub-classB都查出来union结果。
3)每个类层次结构一张表 --- 利用保存类型信息的一个类型辨别标志列
即把所有子类的所有属性的列都包括在同一个表中,由特定行表示的具体子类通过一个类型辨别标识列的值来进行识别。
问题就是有某些列不属于某个子类,而只属于别的子类。并且子类声明的属性的列必须声明可以为空。
Hibernamte XML描述符
<class name="baseClass" table="TableBase">
<discriminator column="typeA" type="String" />
<subclass name="sub-classA" discriminator-value="A">....</subclass>
<subclass name="sub-classB" discriminator-value="B">....</subclass>
</class>
JPA XML描述符:---对应的策略是SINGLE_TABLE
<entity class="baseClass" access="FIELD">
<inheritance strategy="SINGLE_TABLE"/>
<discriminator-column name="columnA" discriminator-tpe="STRING"/>
...
</entity>
<entity class="sub-classA" access="FIELD">
<discriminator-value>A</discriminator-value>
.....
</entity>
4)每个子类一张表
即把继承关系表示为相关的外键关联。声明持久化属性的每个类/子类(包括抽象类甚至接口)都有它自己的表。该表仅仅包含了每个非继承的属性(由子类本身声明的每个属性)以及也是超类表的外键的主键的列。即子表的主键是父表的外键。
Hibernate用<joined-subclass>元素给每个子类映射创建一张表。
<class name="baseClass" table="baseTable">
....
<joined-subclass name="subClassA" table="tableA">
<key column="columnA" />
.......
</class>
当查询基类时候,依赖于外部联接(left join)
JPA中对应的策略就是JOINED
还有一种就是混合策略。
分享到:
相关推荐
《Hibernate实战》这本书深入浅出地探讨了Java领域中广泛使用的对象关系映射框架——Hibernate。Hibernate是一个开源的ORM框架,它为Java开发者提供了一种高效、便捷的方式来管理数据库操作,消除了Java对象与SQL...
《Hibernate映射继承实战解析》 在Java世界中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者用面向对象的方式处理数据,而无需关心底层SQL语句的编写。在大型项目中,...
《Hibernate开发与实战》源代码提供了深入学习和实践Hibernate框架的机会。这个压缩包包含了从CHAPTER01到CHAPTER22的源代码示例,涵盖了Hibernate框架的多个关键方面。遗憾的是,由于文件大小限制,几个项目和必要...
### JavaEE企业应用实战-Struts2+Spring3+Hibernate整合开发(第3版)核心知识点解析 #### 一、JavaEE概述与架构 - **JavaEE简介**:JavaEE(Java Platform, Enterprise Edition)是Java平台的企业版,提供了一套...
### Hibernate实战笔记——深入解析对象关系映射与优化策略 #### 一、对象关系映射(ORM)概念 - **什么是持久化**:在计算机科学领域,“持久化”指的是将程序的数据状态保存到非易失性的存储介质中,以便可以在...
5.1 映射类继承 5.1.1 每个带有隐式多态的具体类一张表 5.1.2 每个带有联合的具体类一张表 5.1.3 每个类层次结构一张表 5.1.4 每个子类一张表 5.1.5 混合继承策略 5.1.6 选择策略 5.2...
《Hibernate实战(第2版)》是一本深入探讨Java持久化框架Hibernate的专业书籍,它针对的是Java开发人员,特别是那些希望提升数据库管理效率和优化应用程序性能的开发者。Hibernate作为一个开源的对象关系映射(ORM...
- **继承映射**: 支持单表、联合表等多种继承映射模式,适用于具有层次结构的数据模型。 #### 五、高级特性与最佳实践 - **缓存管理**: Hibernate支持一级缓存和二级缓存,合理利用缓存可以显著提升应用性能。 - *...
### Hibernate实战(第2版)知识点详解 #### 一、Hibernate框架概述 1. **定义与特点**: - **Hibernate**是一种Java环境下基于JDBC API的ORM(Object Relational Mapping)框架,它提供了从Java类到数据库表以及从...
【hibernate实战培训课程】 本课程旨在深入解析Hibernate这一流行的Java对象关系映射(ORM)框架,旨在帮助开发者理解并熟练运用Hibernate进行数据库操作。课程涵盖了O/R Mapping(对象关系映射)的基本原理,以及...
1. Hibernate配置:包括数据库连接信息、实体类映射文件的加载、缓存设置等,通常在`hibernate.cfg.xml`中完成。 2. 实体类设计:使用Java类来代表数据库中的表,使用注解进行映射。 3. Session工厂和Session:通过...
- **继承的映射**:处理具有继承关系的类与数据库表之间的映射关系。 - **一对一(One-to-One)**、**一对多(One-to-Many)**、**多对一(Many-to-One)**和**多对多(Many-to-Many)**关联关系的映射。 #### 3. ...
实体类通常会继承Hibernate的Serializable接口,用于持久化。映射文件(可能是.hbm.xml)定义了实体类与数据库表的对应关系。测试代码通常在main方法或JUnit测试类中,展示了如何使用SessionFactory创建Session,...
本书包括三部分,第一部介绍Java EE开发的基础知识,以及如何搭建开发环境;第二部分详细讲解Struts ...第三部分示范开发了一个包含7个表、表之间具有复杂的关联映射、继承映射等关系,且业务也相对复杂的工作流案例。
2. **对象关系映射(ORM)**:详细讲解如何使用Hibernate的XML映射文件或注解来定义对象和数据库表之间的映射关系,包括字段映射、关联映射(一对一、一对多、多对一、多对多)以及继承映射策略。 3. **Session和...
《Java JPA与Hibernate实战教程——模块二》 在Java开发领域,JPA(Java Persistence API)和Hibernate作为主流的ORM(对象关系映射)框架,对于数据持久化有着至关重要的作用。本教程的第二模块深入探讨了这两个...
#### 二、Hibernate入门实战 - **第一个Hibernate程序**: - 创建一个简单的Java类,定义实体模型。 - 使用Hibernate提供的API创建SessionFactory和Session。 - 通过Session执行CRUD操作。 - **配置文件**: - ...
在Hibernate中,每个Java类可以映射为一个数据库表,类的实例对应表中的行。通过注解或XML配置,我们可以定义字段与列的映射,以及主键生成策略等。 四、缓存机制 Hibernate 4.3.8.Final引入了第二级缓存,它可以跨...