hibernate显式多态性

rt4zxlrg  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(401)

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

@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(例如,使用一个延迟加载的manytone属性)时,hibernate连接(或者,在本例中,尝试连接,但失败)所有子实体-多态类型.explicit不是告诉hibernate只加载baseentity中的属性吗?
my 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注解)
谢谢你的帮助!

dwbf0jvd

dwbf0jvd1#

这些文档确实具有误导性,但ann-314 jira问题解释了hibernate作者的想法:
多态显式只适用于根实体,并防止查询命名(未Map的)超类以返回Map的子实体
如果父类没有被Map(例如被@entity注解),并且子类具有显式多态性,那么查询超类将不会返回子类。

相关问题