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