我有一个基本实体,具有以下基于注释的配置:
@Entity
@Table(name = "BaseEntities")
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "entityType", discriminatorType = DiscriminatorType.STRING)
@Polymorphism(type = PolymorphismType.EXPLICIT)
public class BaseEntity { //...
我有多个子实体,每个实体都用
注释@Entity
@Table(name = "Users")
@PrimaryKeyJoinColumn(name="id")
@DiscriminatorValue("User")
@XmlRootElement
@Polymorphism(type = PolymorphismType.EXPLICIT)
public class User extends BaseEntity { //...
(是的,所有子实体和基础实体上都有多态注释)
但是,当我查询BaseEntity(带有Lazy加载的ManyToOne属性的fe)时,Hibernate加入(或者,在这种情况下,尝试加入,但失败)所有子实体 - 并不是PolymorphismType.EXPLICIT告诉Hibernate只加载BaseEntity中的属性?
我的persistence.xml:
<persistence-unit name="ebilling-backend" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="javax.persistence.jdbc.url" value="jdbc:mysql://${database.location}:${database.port}/${database.dbname}?zeroDateTimeBehavior=convertToNull&characterEncoding=utf8"/>
<property name="javax.persistence.jdbc.user" value="${database.username}"/>
<property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="javax.persistence.jdbc.password" value="${database.password}"/>
<property name="hibernate.hbm2ddl.auto" value="validate"/>
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
</properties>
</persistence-unit>
如何让Hibernate识别多态性注释? (注意:其他JPA注释是基本的javax.persistence注释 - 这可能是问题吗?)
或者,我想到的另一种方法是让Hibernate使用DiscriminatorColumn,并且只加入该表,但是我该如何实现呢? (没有Hibernate @Any - @AnyMetaDef注释)
谢谢你的帮助!
答案 0 :(得分:1)
文档确实具有误导性,但ANN-314 JIRA问题解释了Hibernate作者的想法:
多态显式仅适用于根实体,并阻止命名(未映射)超类的查询返回映射的子实体
如果未映射父类(例如,使用@Entity注释)和子类 有明确的多态性,然后查询超级类不会返回 子类。