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的主要内容,如果未能解决你的问题,请参考以下文章