当前位置: 首页 > 知识库问答 >
问题:

基于联合遗传策略的HiberNate显式多态性

范彭亮
2023-03-14

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

@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属性)时,HiberNate会联接(或者,在本例中,尝试联接,但失败)所有子实体——难道不是多态性类型。EXPLICIT告诉HiberNate只加载BaseEntity中的属性?

我的坚持。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个答案

茹高义
2023-03-14

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

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

如果父类没有被映射(例如被@Entity注释),并且子类具有显式多态性,那么查询超类将不会返回子类。

 类似资料:
  • 我有以下类结构: 我的目标是将生物对象保存在数据库的一个表中。SkillInterface的子类没有任何字段。因为它们决定了行为,所以我想将选择的SkillInterface类名转换成一个字符串,因为我只需要用skill.getClass()这样的字符串来保存creature的当前技能策略的类名。getSimpleName()。我尝试用@Converter注释实现,使用AttributeConve

  • 我尝试设置我的JPA映射。由于某些原因,我必须有相同的java变量/表列名(包括大写字母),但我不能设置Hibernate。我尝试了明确的列名: 对于隐式映射: 这两种方法都创建不带大写字母的列名——“nextinvoicenr”。 我还试图改变Hibernate配置添加: 但没有成功

  • 问题内容: 我该如何决定使用哪个? , , , 。 我阅读了https://www.hibernate.org/hib_docs/v3/api/org/hibernate/cache/CacheConcurrencyStrategy.html,但没有足够详细地解释。 问题答案: 在Hibernate文档确实在他们定义了很好的工作: 19.2.2。策略:只读 如果您的应用程序需要读取而不是修改持久类

  • 问题内容: 我试图了解如何在hibernate中最好地实现多态一对多。 例如: 现在,我想保留以下类的审核信息: 什么是适当的映射?另外,Hibernate实际上将如何坚持下去呢?将一系列连接的表的生成(,,),或者是有没有更好的办法? 请注意,我宁愿不要让我的其他实体类暴露联接的另一面(例如on ),但是,如果这是最干净的实现方式,那就足够了。 问题答案: 映射的超类不是实体,因此不能成为关联的

  • 问题内容: 我试图每小时创建一个新的日志文件。我在RollingFileAppender中使用lo4j2的TimeBasedTriggerringPolicy。以下是我从log4j2官方站点获取的示例xml配置代码。 在时间间隔属性中,我设置了1表示1小时。但是我的文件仍然不会每1小时滚动一次。 请帮助我发现任何错误。 注意:我包括了log4j2的beta9(这是最新的) 问题答案: 这里的1表示

  • 我正在尝试创建每小时的新日志文件。我正在RollingFileAppender中使用lo4j2的TimeBasedTriggerringPolicy。下面是我从log4j2官方站点获取的示例xml配置代码。 在interval属性中,我设置了1表示1小时。但我的文件并不是每隔1小时滚动一次。