专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » hibernate映射:精通Hibernate的映射继承关系 7 »正文

hibernate映射:精通Hibernate的映射继承关系 7

来源: 发布时间:星期四, 2009年1月15日 浏览:23次 评论:0
  Company和Employee类的间为对多多态关联关系如果继承关系树根类对应个表或者每个类对应个表那么就能映射Company类employees集合本节介绍如何映射多对多态关联如图14-11所示ClassD和ClassA为多对多态关联关系

  假定和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;
  (a instanceof ClassB)
  .out.prln(((ClassB)a).getB1);
  (a instanceof ClassC)
  .out.prln(((ClassC)a).getC1);
  tx.commit;


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

  <many-to-one name="a"
  ="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.,a.getId);
  .out.prln(b.getB1);


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

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

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


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

     

     图14-12 表TABLE_D、TABLE_B和TABLE_C结构

0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: