在数据库设计中,会遇到继承关系的表的设计,一般来说有以下三种映射方法:(假设有HOURLY_EMPLOYEES和SALARIED_EMPLOYEES两个子类,父类EMPLOYEES)
1.把每个子具体类都映射一张表,即只有 HourlyEmployee.hbm.xml和 SalariedEmployee.hbm.xml两个配置文件。
好处:简单方便
坏处:不支持多态查询
例如,为了检索所有employee对象,必须分别检索所有的HourlyEmployee实例和 SalariedEmployee实例,然后把它们合并到同一个集合中。
2.只为根类EMPLOYEES创建一张表,将公共属性和子类特有属性全部引入,并且加一个类型字段EMPLOYEE_TYPE,用于区分Employee的具体类型。
好处:支持多态查询
检索所有employee对象时,如果EMPLOYEE_TYPE字段取值为"HE",就创建 HoulyEmployee实例,如果EMPLOYEE_TYPE字段取值为"SE",就创建SalariedEmployee实例。
坏处:配置文件相应变得复杂:如
Employee.hbm.xml
<hibernate-mapping >
<class name="mypack.Employee" table="EMPLOYEES">
<id name="id" type="long" column="ID">
<generator class="increment"/>
</id>
<discriminator column="EMPLOYEE_TYPE" type="string" />
<property name="name" type="string" column="NAME" />
<subclass name="mypack.HourlyEmployee" discriminator-value="HE" >
<property name="rate" column="RATE" type="double" />
</subclass>
<subclass name="mypack.SalariedEmployee" discriminator-value="SE" >
<property name="salary" column="SALARY" type="double" />
</subclass>
</class>
</hibernate-mapping>
另外,如果公共属性和特有属性比较多时,字段会变得很多,表显得臃肿。
3.为根类和子类都创建映射表,即需要创建EMPLOYEES、HOURLY_EMPLOYEES和SALARIED_EMPLOYEES表。EMPLOYEES表仅包含和Employee类的属性对应的字段(子类共有的属性),HOURLY_EMPLOYEES和SALARIED_EMPLOYEES表也仅包含其类中有的属性对应的字段(特有的属性),另外HOURLY_EMPLOYEES和SALARIED_EMPLOYEES表中都以EMPLOYEES表中的EMPLOYEE_ID字段(主键)作为主键 ,同时也作为外键。
好处:同样支持多态查询,
Employee.hbm.xml
<hibernate-mapping >
<class name="mypack.Employee" table="EMPLOYEES">
<id name="id" type="long" column="ID">
<generator class="increment"/>
</id>
<property name="name" type="string" column="NAME" />
<many-to-one
name="company"
column="COMPANY_ID"
class="mypack.Company"
/>
<joined-subclass name="mypack.HourlyEmployee" table="HOURLY_EMPLOYEES" >
<key column="EMPLOYEE_ID" />
<property name="rate" column="RATE" type="double" />
</joined-subclass>
<joined-subclass name="mypack.SalariedEmployee" table="SALARIED_EMPLOYEES" >
<key column="EMPLOYEE_ID" />
<property name="salary" column="SALARY" type="double" />
</joined-subclass>
</class>
</hibernate-mapping>
通过左外连接获得子类对象的所有属性,如果HE表的EMPLOYEE_ID字段不为null,就创建HoulyEmployee实例,如果SE表的EMPLOYEE_ID字段不为null,就创建SalariedEmployee实例。
当保存一个子类对象时,需要发出两条sql语句分别向子表和EMPLOYEES表中插入记录。(session的save()方法能判断实际引用的子类类型,从而插入记录到不同的子表)那么
总的来说,具体怎么设计,还是要看情况....
分享到:
相关推荐
### 用Hibernate映射继承关系 #### 14.1 继承关系树的每个具体类对应一个表 在Hibernate中映射继承关系时,一种常见的策略是将继承关系树的每个具体类映射到单独的数据库表中。这种方法称为**表/类映射**(Table/...
Hibernate,作为Java中广泛使用的对象关系映射(ORM)框架,提供了多种方式来处理继承关系的映射,其中一种就是"每个类都对应一张表"的策略。本文将深入探讨这种映射方式,以及如何在Hibernate中实现它。 首先,...
在Java的ORM框架Hibernate中,映射继承关系是常见的需求,尤其在处理具有层次结构的实体类时。本文将详细探讨Hibernate中处理继承关系的三种映射策略:subclass、joined-subclass以及union-subclass。 首先,让我们...
在大型项目中,由于业务需求复杂,我们常常会使用到类的继承来组织代码结构,而Hibernate提供了对这些继承关系的映射支持。本主题将深入探讨"Hibernate继承映射+C3P0代码"的相关知识点。 首先,让我们理解Hibernate...
《Hibernate映射继承实战解析》 在Java世界中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。它允许开发者用面向对象的方式处理数据,而无需关心底层SQL语句的编写。在大型项目中,...
Hibernate继承映射是将Java类的继承关系映射到数据库表的一种策略,使得对象模型的复杂性能够平滑地转化为关系数据库模型。本篇将详细介绍Hibernate继承映射的第一种策略——每棵类继承树对应一张表,即单一表继承...
【压缩包子文件的文件名称列表】:“hibernate映射文件自动生成.doc”很可能是这篇博文的文档形式,其中详细介绍了具体的操作步骤、使用工具或者自定义脚本,以帮助开发者理解并应用自动化的映射文件生成过程。...
在ORM(Object-Relational Mapping)框架如Hibernate中,如何优雅地将这些继承关系映射到关系型数据库中,成为了一个重要的议题。本文将深入探讨Hibernate如何处理继承多态映射关系,主要通过三种不同的策略来实现这一...
标题:“Hibernate继承关系映射.pdf” 描述:“简明扼要地介绍了Hibernate中继承关系的映射方式,深入探讨了三种不同的映射策略及其优缺点,同时解析了多态查询的概念。” 知识点: ### Hibernate继承关系映射...
### 常用Hibernate映射配置详解 #### 1. hibernate-mapping节点解析 `hibernate-mapping`节点是Hibernate映射文件中的顶级节点,用于定义一系列配置选项,控制整个映射文件的行为和映射规则。这些配置包括数据库...
Hibernate的继承映射 --每个继承层次一张表 -- 每个具体类一张表 -- 每个类一张表
在实际项目中,我们常常会遇到类的继承关系,而Hibernate提供了强大的支持来处理这种继承关系的映射。本教程以“Hibernate-lab2”为例,将深入探讨Hibernate中的继承映射,为初学者提供一个清晰的学习路径。 一、...
针对hibernate的继承映射部分做了几个测试的例子,更加直观的阐述了继承映射的几种方式以及对应的表结构方式,文件被分割成3部分 http://download.csdn.net/source/259075 http://download.csdn.net/source/259072 ...
Hibernate不仅提供了对基本数据类型的映射,还支持复杂的数据结构,如继承关系的映射。本篇文章将深入探讨Hibernate中的继承映射机制,帮助开发者更好地理解和运用这一强大的功能。 继承是面向对象编程中的核心概念...
在Java企业级开发中,Hibernate是一个非常重要的对象关系映射(ORM)框架,它极大地简化了数据库操作。本文将深入探讨“hibernate关联映射实例”中的关键知识点,包括一对多、多对多和继承映射,这些都是Hibernate中...