`
dreamer_0924
  • 浏览: 180262 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

精通Hibernate之映射继承关系七

阅读更多
Company与Employee类之间为一对多多态关联关系,如果继承关系树的根类对应一个表,或者每个类对应一个表,那么就能映射Company类的 employees集合。本节介绍如何映射多对一多态关联。如图14-11所示,ClassD与ClassA为多对一多态关联关系。
 
图14-11 ClassD与ClassA为多对一多态关联关系

ClassA、ClassB和ClassC构成了一棵继承关系树,如果继承关系树的根类对应一个表,或者每个类对应一个表,那么可以按以下方式映射ClassD的a属性:

<many-to-one name="a"
class="ClassA"
column="A_ID"
cascade="save-update" />

假定与ClassD对应的表为TABLE_D,与ClassA对应的表为TABLE_A,在TABLE_D中定义了外键A_ID,它参照TABLE_A表的主键。

ClassD对象的a属性既可以引用ClassB对象,也可以引用ClassC对象,例如:

tx = session.beginTransaction();
ClassD d=(ClassD)session.get("ClassD",id);
ClassA a=d.getA();
if(a instanceof ClassB)
System.out.println(((ClassB)a).getB1());
if(a instanceof ClassC)
System.out.println(((ClassC)a).getC1());
tx.commit();

以下代码在映射ClassD类的a属性时使用了延迟检索策略:

<many-to-one name="a"
class="ClassA"
column="A_ID"
lazy="true"
cascade="save-update" />

当Hibernate加载ClassD对象时,它的属性a引用ClassA的代理类实例,在这种情况下,如果对ClassA的代理类实例进行类型转换,会抛出ClassCastException:

ClassA a=d.getA();
ClassB b=(ClassB)a; //抛出ClassCastException

解决以上问题的一种办法是使用Session.load()方法:

ClassA a=d.getA();
ClassB b=(ClassB)session.load(ClassB.class,a.getId());
System.out.println(b.getB1());

当执行Session的load()方法时,Hibernate并不会访问数据库,而是仅仅返回ClassB的代理类实例。这种解决办法的前提条件是必须事先知道ClassD对象实际上和ClassA的哪个子类的对象关联。

解决以上问题的另一种办法是显式使用迫切左外连接检索策略,避免Hibernate创建ClassA的代理类实例,而是直接创建ClassA的子类的实例:

tx = session.beginTransaction();
ClassD d=(ClassD)session.createCriteria(ClassD.class)
.add(Expression.eq("id",id))
.setFetchMode("a",FetchMode.EAGER)
.uniqueResult();
ClassA a=d.getA();
if(a instanceof ClassB)
System.out.println(((ClassB)a).getB1());
if(a instanceof ClassC)
System.out.println(((ClassC)a).getC1());
tx.commit();

如果继承关系树的具体类对应一个表,为了表达ClassD与ClassA的多态关联,需要在TABLE_D中定义两个字段:A_ID和A_TYPE, A_TYPE字段表示子类的类型,A_ID参照在子类对应的表中的主键。图14-12显示了表TABLE_D、TABLE_B和TABLE_C的结构。

图14-12 表TABLE_D、TABLE_B和TABLE_C的结构
分享到:
评论

相关推荐

    精通Hibernate:Java持久化对象技术详解[第二版]

    9. **多态和继承映射**:讲解如何处理类的继承关系,实现多态查询,包括单表继承、联合继承和表格派生。 10. **级联操作与代理**:阐述级联属性的使用,如何实现对象间的联动操作,以及Hibernate的动态代理机制。 ...

    精通hibernate3.0(第三版).rar

    《精通Hibernate 3.0(第三版)》是Java开发者深入理解对象持久化技术的一本经典教程。本书全面覆盖了Hibernate 3.0的核心概念、API以及最佳实践,旨在帮助读者掌握这一强大的ORM(对象关系映射)框架,提升开发效率...

    精通Hibernate(孙卫琴)

    接着,孙卫琴深入探讨了Hibernate的对象关系映射(ORM)机制,包括实体类的定义、属性注解、主键生成策略、关联映射(一对一、一对多、多对多)以及继承映射等。这些内容让读者能够将Java对象与数据库表进行无缝对接...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

    第12章 映射继承关系  12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件  12.1.2 操纵持久化对象  12.2 继承关系树的根类对应一个表  12.2.1 创建映射文件  12.2.2 操纵持久化对象  12.3 继承...

    精通Hibernate与参考文档

    这个压缩包包含了两份关键文件:《Hibernate参考文档.chm》和《精通Hibernate:Java对象持久化技术详解.pdf》,旨在帮助开发者深入理解和熟练运用Hibernate这一强大的ORM(对象关系映射)工具。 一、Hibernate简介 ...

    精通Hibernate孙卫琴 pdf

    《精通Hibernate孙卫琴》是Java开发者们广泛阅读的一本技术专著,由知名Java专家孙卫琴撰写。这本书深入浅出地介绍了Hibernate这一强大的对象关系映射(ORM)框架,帮助开发者理解和掌握如何在Java应用程序中高效地...

    精通Hibernate:Java对象持久化技术详解

    7. **多对一、一对多、多对多关系映射**:Hibernate支持复杂的关联关系映射,如单向关联、双向关联、自关联等。 8. **继承映射**:允许开发者使用Java的继承结构来设计数据库表,如单表继承和联合继承。 9. **延迟...

    精通Hibernate源代码

    2. **Chapter 7**:可能涉及对象关系映射(ORM)的细节,包括实体类的定义、属性注解、继承关系的处理等。这是Hibernate的核心功能,它允许我们将Java对象直接映射到数据库表。 3. **Chapter 14**:可能是关于HQL...

    精通Hibernate图书欣赏及PDF阅读器

    首先,Hibernate作为Java领域中最受欢迎的对象关系映射(ORM)框架之一,它允许开发者用面向对象的方式处理数据库操作,避免了SQL语言的直接操作,降低了开发难度。书中会详细介绍Hibernate的核心组件,如...

    精通hibernate源码ch4

    Hibernate遵循Java Persistence API(JPA)标准,提供了丰富的映射机制,包括一对一、一对多、多对一、多对多等各种关系映射,以及继承映射、复合主键等特性,使得对象关系的映射变得简单直观。 总结,精通...

    孙卫琴.精通Hibernate.zip

    精通Hibernate:Java对象持久化技术详解》这本书深入浅出地介绍了Hibernate这一流行的Java对象关系映射(ORM)框架。Hibernate是Java开发人员在处理数据库操作时常用的工具,它极大地简化了数据库与Java对象之间的...

    孙卫琴版的精通hibernate

    接着,她深入讲解了Hibernate的对象模型,包括实体类、持久化属性、继承关系、多对一、一对一、一对多和多对多等关联映射的实现方式。 此外,书中还详细阐述了Hibernate的主要API,如Session、Transaction、Query和...

    精通hibernate(part 2)共分4个part (孙卫琴)

    ### 精通Hibernate(Part 2):深入探索Hibernate框架在J2EE中的应用 #### Hibernate概述 Hibernate是一款开放源代码的对象关系映射(Object Relational Mapping,ORM)框架,它对JDBC进行了非常轻量级的对象封装...

Global site tag (gtag.js) - Google Analytics