由于关系数据模型不允许一个表的外键同时参照两个表的主键,因此无法对TABLE_D表的A_ID字段定义外键参照约束,而应该通过其他方式,如触发器, 来保证A_ID字段的参照完整性。由于TABLE_D表的A_ID字段既可能参照TABLE_B表的ID主键,也可能参照TABLE_C表的ID主键,要 求TABLE_B表和TALBE_C表的ID主键具有相同的SQL类型。
在ClassD.hbm.xml文件中,用元素来映射ClassD的a属性:
<any name="a"
meta-type="string"
id-type="long"
cascade="save-update">
<meta-value value="B" class="ClassB" />
<meta-value value="C" class="ClassC" />
<column name="A_TYPE" />
<column name="A_ID" />
</any>
元素的meta-type属性指定TABLE_D中A_TYPE字段的类型,id-type属性指定TABLE_D中A_ID字段的类型,子元素设定 A_TYPE字段的可选值。在本例中,如果A_TYPE字段取值为"B",表示为ClassB的对象,A_ID字段参照TABLE_B表中的ID主键;如 果A_TYPE字段取值为"C",表示为ClassC的对象,A_ID字段参照TABLE_C表中的ID主键。子元素指定TABLE_D表中的 A_TYPE字段和A_ID字段,必须先指定A_TYPE字段,再指定A_ID字段。
小结
本章介绍了映射继承关系的三种方式:
继承关系树的每个具体类对应一个表:在具体类对应的表中,不仅包含和具体类的属性对应的字段,还包含和具体类的父类的属性对应的字段。这种映射方式不支持多态关联和多态查询。
继承关系树的根类对应一个表:在根类对应的表中,不仅包含和根类的属性对应的字段,还包含和所有子类的属性对应的字段。
这种映射方式支持多态关联和多态查询,并且能获得最佳查询性能,缺点是需要对关系数据模型进行非常规设计,在数据库表中加入额外的区分各个子类的字段,此外,不能为所有子类的属性对应的字段定义not null约束。
继承关系树的每个类对应一个表:在每个类对应的表中只需包含和这个类本身的属性对应的字段,子类对应的表参照父类对应的表。
这种映射方式支持多态关联和多态查询,而且符合关系数据模型的常规设计规则,缺点是它的查询性能不如第二种映射方式。在这种映射方式下,必须通过表的内连接或左外连接来实现多态查询和多态关联。
在默认情况下,对于简单的继承关系树可以采用根类对应一个表的映射方式。如果必须保证关系数据模型的数据完整性,可以采用每个类对应一个表的映射方式。对于复杂的继承关系树,可以将它分解为几棵子树,对每棵子树采用不同的映射方式。
当然,在设计域模型时,应该尽量避免设计过分复杂的继承关系,这不仅会增加把域模型映射到关系数据模型的难度,而且也会增加在Java程序代码中操纵持久化对象的复杂度。
对于不同的映射方式,必须创建不同的关系数据模型和映射文件,但是域模型是一样的,域模型中的持久化类的实现也都一样。
只要具备Java编程基础知识,就能创建具有继承关系的持久化类,因此本章没有详细介绍这些持久化类的创建过程,在此仅提醒一点,子类的完整构造方法不 仅负责初始化子类本身的属性,还应该负责初始化从父类中继承的属性,例如以下是HourlyEmployee类的构造方法:
public class HourlyEmployee extends Employee{
private double rate;
/** 完整构造方法*/
public HourlyEmployee(String name, double rate,Company company) {
super(name,company);
this.rate=rate;
}
/** 默认构造方法*/
public HourlyEmployee() {}
……
}
Hibernate只会访问持久化类的默认构造方法,永远不会访问其他形式的构造方法。提供以上形式的完整构造方法,主要是为Java应用的编程提供方便。
分享到:
相关推荐
9. **多态和继承映射**:讲解如何处理类的继承关系,实现多态查询,包括单表继承、联合继承和表格派生。 10. **级联操作与代理**:阐述级联属性的使用,如何实现对象间的联动操作,以及Hibernate的动态代理机制。 ...
《精通Hibernate 3.0(第三版)》是Java开发者深入理解对象持久化技术的一本经典教程。本书全面覆盖了Hibernate 3.0的核心概念、API以及最佳实践,旨在帮助读者掌握这一强大的ORM(对象关系映射)框架,提升开发效率...
接着,孙卫琴深入探讨了Hibernate的对象关系映射(ORM)机制,包括实体类的定义、属性注解、主键生成策略、关联映射(一对一、一对多、多对多)以及继承映射等。这些内容让读者能够将Java对象与数据库表进行无缝对接...
第12章 映射继承关系 12.1 继承关系树的每个具体类对应一个表 12.1.1 创建映射文件 12.1.2 操纵持久化对象 12.2 继承关系树的根类对应一个表 12.2.1 创建映射文件 12.2.2 操纵持久化对象 12.3 继承...
这个压缩包包含了两份关键文件:《Hibernate参考文档.chm》和《精通Hibernate:Java对象持久化技术详解.pdf》,旨在帮助开发者深入理解和熟练运用Hibernate这一强大的ORM(对象关系映射)工具。 一、Hibernate简介 ...
《精通Hibernate孙卫琴》是Java开发者们广泛阅读的一本技术专著,由知名Java专家孙卫琴撰写。这本书深入浅出地介绍了Hibernate这一强大的对象关系映射(ORM)框架,帮助开发者理解和掌握如何在Java应用程序中高效地...
8. **继承映射**:允许开发者使用Java的继承结构来设计数据库表,如单表继承和联合继承。 9. **延迟加载**:Hibernate的懒加载机制可以在需要时才加载关联的对象,避免了不必要的数据库访问,提高了效率。 10. **...
2. **Chapter 7**:可能涉及对象关系映射(ORM)的细节,包括实体类的定义、属性注解、继承关系的处理等。这是Hibernate的核心功能,它允许我们将Java对象直接映射到数据库表。 3. **Chapter 14**:可能是关于HQL...
首先,Hibernate作为Java领域中最受欢迎的对象关系映射(ORM)框架之一,它允许开发者用面向对象的方式处理数据库操作,避免了SQL语言的直接操作,降低了开发难度。书中会详细介绍Hibernate的核心组件,如...
精通Hibernate:Java对象持久化技术详解》这本书深入浅出地介绍了Hibernate这一流行的Java对象关系映射(ORM)框架。Hibernate是Java开发人员在处理数据库操作时常用的工具,它极大地简化了数据库与Java对象之间的...
接着,她深入讲解了Hibernate的对象模型,包括实体类、持久化属性、继承关系、多对一、一对一、一对多和多对多等关联映射的实现方式。 此外,书中还详细阐述了Hibernate的主要API,如Session、Transaction、Query和...
Hibernate遵循Java Persistence API(JPA)标准,提供了丰富的映射机制,包括一对一、一对多、多对一、多对多等各种关系映射,以及继承映射、复合主键等特性,使得对象关系的映射变得简单直观。 总结,精通...
### 精通Hibernate(Part 2):深入探索Hibernate框架在J2EE中的应用 #### Hibernate概述 Hibernate是一款开放源代码的对象关系映射(Object Relational Mapping,ORM)框架,它对JDBC进行了非常轻量级的对象封装...