Hibernate 忽略单继承的 FetchType

Posted

技术标签:

【中文标题】Hibernate 忽略单继承的 FetchType【英文标题】:Hibernate ignores FetchType for Single Inheritance 【发布时间】:2012-01-24 08:35:13 【问题描述】:

我有 3 个实体继承自另一个实体。 我正在使用策略 Single_Table

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

例如B、C 和 D 类继承自 A

在实体 B 上,我急切地加载另一个实体 X。不幸的是,Hibernate 忽略了我的注释并为每个实体 B 创建一个选择以获取实体 X。

@ManyToOne(fetch=FetchType.EAGER)
private Projekt projekt;

我的选择语句如下所示: '从 A 中选择一个'

更多代码示例:

@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "DType", discriminatorType = DiscriminatorType.STRING, length = 3)
public abstract class A 


@Entity
@DiscriminatorValue(B.PREFIX)
public class B extends A 

   @ManyToOne(fetch=FetchType.EAGER)
   private Projekt projekt;

现在我希望 Hibernate 查询从 A 继承的所有类,它确实如此。不幸的是,它还为每个结果行执行一个 select 语句来查询“projekt”,这是我想避免的。

【问题讨论】:

您的选择语句不是有效的 JPQL。你确定不是“从A中选择一个”吗?如果 Hibernate 为每个 B 生成一个选择来获取 X,那么它不会忽略您的注释:X 是急切地获取的。 谢谢,我更改了示例。我试图让它尽可能简单。 【参考方案1】:

Hibernate 不会将连接插入到从 HQL/JPQL 生成的 SQL 查询中,用于 FetchType.EAGER

为了插入join,您需要明确指定left join fetch,我想它不会为InheritanceType.SINGLE_TABLE 造成问题,尽管这种关系在其他子类中不存在:

from A a left join fetch a.projekt

【讨论】:

【参考方案2】:

你想让它做什么?如果您执行“从 A” - 那么它正在获取所有继承类型的实体。不可能(或至少不容易)创建一个获取 B、C、D 的 sql 查询,然后 B 急切地获取 X。你想要它做什么?

为避免多次查询,您可以在关联上设置 BatchSize。这将优化批量加载 Xs - 而不是每个 B 一个查询。

如果您只对 B 实体感兴趣,您可以将查询编写为“来自 B”,在这种情况下,将急切获取关联。

【讨论】:

我更新了问题。我想获取所有条目。这可以正常工作。但我不希望 B 类的每一行都有另一个 select 语句来查询成员项目。我尝试使用所有这些注释,但它们将被忽略。

以上是关于Hibernate 忽略单继承的 FetchType的主要内容,如果未能解决你的问题,请参考以下文章

使用单表的休眠继承

我可以删除 Hibernate 单表继承中的鉴别器列吗?

单表继承(休眠)的 JPA 2 标准查询

Hibernate 命名策略被忽略

PSQLException:大对象不能在自动提交模式下使用

为啥 Hibernate 会忽略 package-info.java?