我有一个基本实体,具有以下基于注释的配置:
@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&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/