频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

精通Hibernate之映射继承关系(六)

来源: 作者:佚名 出处:巧巧读书 2008-01-19 进入讨论组
下一页 1 2 

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

精通Hibernate之映射继承关系(六)(图一)

  图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的哪个子类的对象关联。

请保留地址 http://www.qqread.com/java/2008/01/i393797.html 更多文章 更多内容请看Hibernate原理与配置Hibernate高级特性Hibernate相关文章专题,或进入讨论组讨论。
下一页 1 2 
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
讨论组问题推荐
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章