2013-12-18 64 views
0

我有一個運行良好的JBoss的7.1JPA產生額外的SQL對多對一渴望映射

select s FROM Sense s where .... etc 
一個Java對象查詢(休眠JPA2)

這個SQL出現在JBoss控制檯:

select 
sense0_.id as id12_, 
sense0_.domain as domain12_, 
sense0_.lemma as lemma12_, 
sense0_.part_of_speech as part5_12_, 
sense0_.sense_number as sense2_12_ 
from sense sense0_ 
where ... 

它正確

但是,在Jboss控制檯中還出現了大量與'Sense'屬性相關的查詢,這些字段是對其他實體的引用,如 Domain,Word,PartOfSpeach。

select domain0_.id as id5_0_, domain0_.description as descript2_5_0_, 
domain0_.name as name5_0_ from domain .... 
select word0_.id as id19_2_, word0_.id_lexicon as id3_19_2_ from word 
word0_ .... 
select partofspee0_.id as id9_2_, domains1_.id_pos as id1_9_4_ from 
part_of_speech partofspee0 ..... 

實體感映射代碼:

@ManyToOne(fetch=FetchType.EAGER) 
@JoinColumn(name="domain", referencedColumnName="id", nullable = false) 
private Domain domain; 

@ManyToOne(fetch=FetchType.EAGER) 
@JoinColumn(name="lemma", referencedColumnName="id", nullable = false) 
private Word lemma; 

@ManyToOne(fetch=FetchType.EAGER) 
@JoinColumn(name="part_of_speech", referencedColumnName="id", nullable = false) 
private PartOfSpeech partOfSpeech; 

爲什麼JPA生成用於映射的引用字段這些附加SQLS?這些字段具有EAGER提取類型,但我希望我只能得到一個SQL(第一個有Sense),並且與其他EAGER實體左連接。通過這種方式,當我要求許多Sense對象時,我得到了大量無用的SQL,這需要大量時間來執行。

UPDATE:更改爲LAZY幫助,但在離開LAZY是不是我想要的東西 - 這將迫使我改變我所有的DAO的代碼。

回答

1

如果你想解決的問題,改了一下您查詢,在其中您讓自己的內/ LEFT JOINS查詢,像:

SELECT s FROM Sense s INNER JOIN FETCH s.domain LEFT JOIN FETCH s.word where... 

使用內/左聯接取決於你實體關係(強制/可選)。

幾點說明:預先抓取意味着這些關係也牽強,實體返回到您的代碼之前,但是,這並不意味着它使一個單一的查詢。

+0

我用左手查詢連接'選擇■從意識的左聯接s.domain左連接s.lemma左連接s.partOfSpeech左加入s.senseToSynset'但仍ORM產生這些額外的SQL的。所以現在我有一個選擇形式意義,3個左外連接和3個額外的映射實體選擇。我需要擺脫這3個額外的選擇。使用內部/讀取連接也沒有幫助。 – Gorky

+0

更新了查詢(忘了添加FETCH)... –

+0

當我改爲LAZY獲取類型並使用JOIN FETCH時,我只有一個sql,所以它的工作!但現在我因爲懶惰而被迫改變我的所有代碼。有沒有解決方案離開EAGER並使用JOIN FETCH來實現我所需要的? – Gorky