【问题标题】:How do I get Hibernate to ignore subclasses?如何让 Hibernate 忽略子类?
【发布时间】:2017-06-07 16:40:48
【问题描述】:

我有两个班级 C1 和 C2。每个都保留在自己的表中。每个都有自己的 Hibernate XML 描述,提到了自己的表。这些类之间根本没有联系。

除了 C1 是 C2 的子类。

显然 C1 的 XML 从 C2 复制了很多(添加了一些东西),但它是一个单独的副本。再说一遍:XML 文件都没有提到其他类或其他表。

但是现在,当我执行“来自 C2”的查询时,Hibernate 会拉入所有两个表。

从逻辑上讲,这是有道理的:C1 实际上是 C2,所以如果我想要所有 C2,我也需要 C1,所以我们需要读取 C1 的所有表。 Hibernate 必须使用反射来检测 C2 的子类 C1。

假设这是预期的行为(尽管我没有预料到!)我该如何避免它?有什么办法可以告诉 Hibernate,当我说“来自 C2”时,我的意思是仅启动 C2 而不是启动 C1?是否有一个子句可以添加到查询中,将其限制为非 C1 类型的对象,同时避免首先查询 C1 表的性能损失?

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    当你从 C2 中选择时,它也会在休眠状态下默认选择 C1。它被称为多态查询。请参阅 Polymorphic queriesTutorial

    要修复/解决它,您应该添加类型为 PolymorphismType.EXPLICIT 的多态注释

    @Polymorphism(type = PolymorphismType.EXPLICIT)

    来自https://docs.jboss.org/hibernate/orm/5.2/javadocs/

    IMPLICIT - 如果检索到它的任何超级实体,则检索该实体。默认,

    EXPLICIT - 仅在明确询问时才检索此实体。

    【讨论】:

    • PolymorphismType.EXPLICIT 在 C1 或 C2 上?
    猜你喜欢
    • 2012-09-03
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 1970-01-01
    • 2015-12-01
    • 1970-01-01
    • 2014-11-12
    • 1970-01-01
    相关资源
    最近更新 更多