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的代碼。
我用左手查詢連接'選擇■從意識的左聯接s.domain左連接s.lemma左連接s.partOfSpeech左加入s.senseToSynset'但仍ORM產生這些額外的SQL的。所以現在我有一個選擇形式意義,3個左外連接和3個額外的映射實體選擇。我需要擺脫這3個額外的選擇。使用內部/讀取連接也沒有幫助。 – Gorky
更新了查詢(忘了添加FETCH)... –
當我改爲LAZY獲取類型並使用JOIN FETCH時,我只有一個sql,所以它的工作!但現在我因爲懶惰而被迫改變我的所有代碼。有沒有解決方案離開EAGER並使用JOIN FETCH來實現我所需要的? – Gorky