2012-11-17 26 views
1

我有这种情况:父类Person,子类:个人和企业。我与连接子类策略映射这个类是这样的:Hibernate 4:HQL和继承 - 获取集合和javassist

<hibernate-mapping> 
    <class catalog="test" name="test.Person" table="Persons"> 
    <id name="id" type="int"> 
     <column name="IdPerson"/> 
     <generator class="increment"/> 
    </id> 

    <set inverse="true" name="addresses"> 
     <key> 
     <column name="IdPerson" not-null="true"/> 
     </key> 
     <one-to-many class="test.Address"/> 
    </set> 

    <set inverse="true" name="phones"> 
     <key> 
     <column name="IdPerson" not-null="true"/> 
     </key> 
     <one-to-many class="test.Phone"/> 
    </set> 

    <joined-subclass name="test.Individual" table="Individuals"> 
     <key column="IdPerson"/> 

     <property name="nameIndividual" type="string"> 
     <column length="30" name="Name" not-null="true"/> 
     </property> 
    ... 
    </joined-subclass> 

    <joined-subclass name="test.Enterprise" table="Enterprises"> 
     <key column="IdPerson"/> 

     <property name="nameEnterprise" type="string"> 
     <column length="30" name="Name" not-null="true"/> 
     </property> 
    ... 
    </joined-subclass> 

    </class> 

    <class catalog="test" name="test.Address" table="Addresses"> 

    <composite-id class="test.AddressId" name="id"> 
     <key-many-to-one name="person" class="test.Person"> 
     <column name="IdPerson" not-null="true"/> 
     </key-many-to-one> 
     <key-property name="id" type="int"> 
     <column name="IdAddress"/> 
     </key-property> 
    </composite-id> 

    <many-to-one name="person" class="test.Person" fetch="select" insert="false" update="false"> 
     <column name="IdPerson" not-null="true"/> 
    </many-to-one> 
    ...  
    </class> 

    <class catalog="test" name="test.Phone" table="Phones"> 

    <composite-id class="test.PhoneId" name="id"> 
     <key-many-to-one name="person" class="test.Person"> 
     <column name="IdPerson" not-null="true"/> 
     </key-many-to-one> 
     <key-property name="id" type="int"> 
     <column name="IdPhone"/> 
     </key-property> 
    </composite-id> 

    <many-to-one name="person" class="test.Person" fetch="select" insert="false" update="false"> 
     <column name="IdPerson" not-null="true"/> 
    </many-to-one> 
    ... 
    </class> 

</hibernate-mapping> 

当我使用这个简单的HQL装载的人员名单:

List result = session.createQuery("from Person as en").list(); 

休眠解析多态性ok了,我得到个人和企业对象列表。

但是当我包括地址和电话:

List result = session.createQuery("from Person as en left join fetch en.addresses left join fetch en.phones").list(); 

休眠返回_人_ $$ javassist_5对象的名单,没有获得Indivual和企业类的特定属性。

这是预期的行为?我怎么能解决这个问题?

在此先感谢。

编辑:

我已经包含了地址和电话类的映射,它的ID是复合材料,它似乎是由Hibernate生成的了Javassist代理的原因,但为什么代理不正确解析多态性?即使hibernate从数据库获取所有数据。

我的JSF页面抛出一​​个javax.el.PropertyNotFoundException错误:类'test.Person _ $$ _ javassist_5'没有属性'nameIndividual'。

回答

0

我试过类似的例子,即一个类有两个连接子类 ,父类有一对多的关联。

就像在你的例子中,我没有使用抓取检索父类记录,然后“左连接抓取”。

这两次都正确检索一对多关联。

当我使用提取模式时,结果列表包含重复记录。

例如在一对多关联中,一个记录在关联表中有4条记录,则结果列表包含同一个对象4次。 对于其他记录,如果关联有2条记录,则结果列表包含同一个对象2次。

但预计为每Hibernate的文档: - 。 http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/queryhql.html

“fetch构造不能()查询使用迭代所谓的(scroll()可以使用)被用来获取应一起使用setMaxResults()或setFirstResult(),因为这些操作是基于结果行的,这些行通常包含用于提前采集的重复项,因此,行数并不是您所期望的.Fetch也不应该与带条件的即兴式一起使用。通过连接在查询中获取多个集合可以创建笛卡尔产品,因此请注意这种情况。加入获取多个集合角色可能会产生意外的包映射结果,因此用户的判断是在制定这种情况下的查询时建议。最后,请注意,完全联合提取和右联合提取没有意义。“

+0

感谢您的时间和答案,对不起,我省略了地址和电话映射,如果这些类具有简单的ID,那么休眠可以在您评论时正常工作,但他们实际上是复合的。 – vladiastudillo