Hibernate忽略单一继承的FetchType

时间:2011-12-20 11:05:30

标签: hibernate jpa fetching-strategy

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

@Inheritance(strategy = InheritanceType.SINGLE_TABLE)

E.g。 B,C和D类继承自A

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

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

我的select语句如下所示:     '从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”,我想避免这种情况。

2 个答案:

答案 0 :(得分:1)

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

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

from A a left join fetch a.projekt

答案 1 :(得分:0)

你想要它做什么?如果你做“来自A” - 那么它将获取所有继承类型的实体。创建一个获取B,C,D然后为B提取X的sql查询是不可能的(或者至少不容易)。你想要它做什么?

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

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