hibernate中两个实体类与同一张数据表进行映射后出现的问题解决

时间:2022-04-08 14:47:48
        最近项目中遇到了一个子系统需要整合到它的父系统的问题,由于父系统和子系统的工程比较庞大 ,涉及到的class也是相当的多。最后不得已将其中比较关键的class对应的数据表进行了统一。那么就需要两个实体类映射到同一张数据表中。这两个实体类之间进行了继承(sobject   extends  fobject)。本以为这样就万事大吉了,可是没想到,在对其模块进行检索的时候问题出现了,其中父类所对应的模块检索出现了 第一个问题,在执行query.setMaxResults()方法后,检索不到任何的记录。如果不执行此方法,则能够检索到数据表中的记录。但是,发现这样检索到的记录却是重复的, 第二个问题出现了:其中不仅返回了所需要的对象(fobject)而且它的子类(sobject)也返回来了。后来,查了些资料才发现,自己忽略了一个问题。就是配置文件中 polymorphism属性的设置问题。 polymorphism默认值为 implicit 是隐式的实现多态。

Implicit (隐式)的多态是指,如果查询中给出的是任何超类、该类实现的接口或者该类的名字,都会返回这个类的实例;如果查询中给出的是子类的名字,则会返回子类的实例。
Explicit
(显式)的多态是指,只有在查询中给出的明确是该类的名字时才会返回这个类的实例;同时只有当在这个 <class>的定义中作为 <subclass>或者 <joined-subclass>出现的子类,才会可能返回。 大多数情况下,默认的 polymorphism="implicit"都是合适的。 显式的多态在有两个不同的类映射到同一个表的时候很有用。(允许一个“轻型”的类,只包含部分表字段)。

       这样我就明白了,我需要更改这两个class对应的映射文件把 polymorphism属性设置为explicit。这样这两个问题就解决了,程序能够从数据库中检索到记录并返回了我所需要的对象。但是,第一个问题暂时还没有弄清楚,为什么之前隐式的实现多态的话,执行query.setMaxResults()方法之后,会检索不到任何记录。以后有时间我再细细研究吧。同时也希望各位大侠如果遇到类似的问题话,能给我解释一下。


网络资料收集:

http://java.ccidnet.com/html/document/hibernate_doc.html

http://www-128.ibm.com/developerworks/cn/java/j-hibernate/index.html