2012-01-11 25 views
3

在Hibernate映射,我已經設置了屬性lazy="false",這取父的所有子記錄。Hibernate映射設置爲lazy =「假」

這是在整個應用程序中使用。
這會在我的應用程序的特定模塊中創建性能問題,其中我只想提取父記錄。

我不能將lazy屬性更改爲true,因爲它正在許多其他地方使用。有沒有辦法來解決這個問題?

請讓我知道是否需要更多信息。

回答

6

這些功能在休眠時沒有這樣的功能,因爲它尊重您的lazy="false"。所以,我可以建議什麼來解決您的需求是擴展您的查詢類與另一個虛擬的具體類,並定義該類的映射沒有它的兒童關聯。

比方說您有類帶子女的單親映射在它

class Parent{ 

    private List<Child> kids; 

} 

和你父映射是

<class name="Parent" table="PARENT"> 
// other properties 
// child mapping 
    <set name="kids" table="KIDS" lazy="false"> 
     <key column="parent_id"/> 
     <one-to-many class="Child"/> 
    </set> 
</class> 

然後你就可以創建擴展父類

class MinimalParent extends Parent{ 
    // leave implementation as blank 
} 
另一個類

然後將其映射爲波紋管

<class name="MinimalParent" table="PARENT"> 
    // other properties 
    // do not map child in this 
</class> 

並使用此MinimalParent類無論你只需要父對象。希望你明白了!

+0

感謝您的幫助。因爲我對hibernate很新,你能告訴我怎麼去做嗎? – Chillax 2012-01-11 07:54:06

+0

更新了我的答案。 PLZ檢查 – Pokuri 2012-01-11 08:41:12

+0

@Pokuri如果我沒有映射子屬性,那麼我將如何獲得代理? – wolverine 2014-08-06 12:48:51

3

你或許應該設置爲lazy =「true」將只獲取父爲默認,並使用JPQL查詢與「抓取連接」與孩子們一起取父任何需要的地方,比如:

SELECT mag FROM Magazine mag JOIN FETCH mag.articles WHERE mag.id = 1 
+0

感謝您的幫助。這是無法完成的,因爲這意味着在使用這些代碼的情況下會改變很多代碼。還有其他的選擇嗎? – Chillax 2012-01-11 07:27:19