2011-12-20 76 views
1

我有3个实体从另一个实体继承。 我使用的策略Single_Table休眠忽略FetchType的单继承

@Inheritance(strategy = InheritanceType.SINGLE_TABLE) 

E.g. B类,C和D遗传自A

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

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

我的select语句如下所示:从A A'

一些更多的代码示例 'select一个:

@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,它确实inherite所有类。不幸的是,它也为每个结果行执行select语句来查询我想避免的“projekt”。

+0

你的SELECT语句无效的JPQL。你确定它不是“从A a中选择一个”吗?如果Hibernate为每个B生成一个选择来获取X,那么它不会忽略注释:X会被急切地取出。 – 2011-12-20 11:13:59

+0

谢谢,我改变了这个例子。我试图让它尽可能简单。 – Daniel 2011-12-20 11:33:02

回答

1

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

为了插入join你需要明确指定left join fetch,我想这不会尽管这种关系并不存在于其他子类创建InheritanceType.SINGLE_TABLE问题:

from A a left join fetch a.projekt 
0

你想干什么?如果您从“A”开始 - 那么它将获取所有继承类型的实体。这是不可能的(或至少不容易)创建一个SQL查询获取B,C,D,然后让B快速地获取X.你想要它做什么?

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

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

+0

我更新了问题。我想获取所有条目。这工作正常。但我不想为B类的每一行查询成员项目另外选择语句。我试图使用所有这些注释,但它们将被忽略。 – Daniel 2011-12-20 11:34:07