2011-12-20 93 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