具有JOINED继承策略的Hibernate显式多态性

时间:2015-01-15 14:53:14

标签: java hibernate jpa orm hibernate-mapping

我有一个基本实体,具有以下基于注释的配置:

@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&amp;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注释)

谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

文档确实具有误导性,但ANN-314 JIRA问题解释了Hibernate作者的想法:

  

多态显式仅适用于根实体,并阻止命名(未映射)超类的查询返回映射的子实体

     

如果未映射父类(例如,使用@Entity注释)和子类   有明确的多态性,然后查询超级类不会返回   子类。