java - 使用 JOINED 继承策略的 Hibernate 显式多态性

标签 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(例如使用延迟加载的 ManyToOne 属性)时,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 注释)

感谢您的帮助!

最佳答案

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

Polymorphism explicit only applies on root entities and prevents queries naming a (unmapped) superclass to return mapped sub entities

If the parent class was not mapped (e.g. being annotated with @Entity) and the sub-classes were having explicit polymorphism, then querying for super-class would not return the sub-class.

关于java - 使用 JOINED 继承策略的 Hibernate 显式多态性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27966134/

相关文章:

java - 交换方法在 C# 中如何在内存级别工作?

java - 数据集中的行数问题

spring - grails- 2.3.4 generate-all命令不起作用

hibernate - 加速 LocalSessionFactoryBean dropDatabaseSchema、createDatabaseSchema

java - 使用 Pivotal Cloud Foundry RabbitMQ 和 mysql 服务,使用 vcap 服务进行 Spring Data JPA 应用程序

mysql - org.apache.openjpa.lib.jdbc.ReportingSQLException、MySQL、OpenJPA、Geronimo

java - 使用 hibernate jpa 将大对象保存到 postgresql db

java - 您可以使用 java 客户端 API 为 K8S 构建自定义 Controller 吗?

java - 在Java中初始化多维数组

java - 如何删除 json 中不需要的细节