2

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

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

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

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

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

我的选择语句如下所示:'select a from A 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”,这是我想避免的。

4

2 回答 2

1

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

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

from A a left join fetch a.projekt
于 2011-12-20T11:45:28.093 回答
0

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

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

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

于 2011-12-20T11:14:15.303 回答