我有一个基本实体,具有以下基于注解的配置:
@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&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条答案
按热度按时间dwbf0jvd1#
这些文档确实具有误导性,但ann-314 jira问题解释了hibernate作者的想法:
多态显式只适用于根实体,并防止查询命名(未Map的)超类以返回Map的子实体
如果父类没有被Map(例如被@entity注解),并且子类具有显式多态性,那么查询超类将不会返回子类。