是否有一些簡單的方法來獲取大對象圖的所有關聯,而不必將所有關聯都「左連接獲取」?難道我不能讓Hibernate默認提取渴望的關聯嗎?休眠 - 如何使聯繫渴望(全球)?
回答
即使有可能有一個全球lazy=false
(谷歌沒有顯示它,但它可能是可能的),你真的不想這樣做。你真的想爲每個請求加載整個數據庫或重要的對象圖嗎?請記住,hibernate的工作方式,它需要實例化圖中的每個對象。它會變得很慢並且內存密集,並且隨着數據的增長可能會導致應用程序崩潰。
如果您必須加載大量數據,請使用自定義hql查詢,並將所需的字段從表中拉出。避免對象實例化。此外,你可以讓db通過使用view來做很多繁重的工作;即讓db不斷動態更新虛擬表,所以您只需從Web應用程序角度選擇一個表即可。
另一種選擇是重做您的互動,因此您不必首先執行此操作。
我不知道全局開關。儘管如此,使用註釋控制抓取仍然有效。
@Proxy(lazy = false)
public class SomeBean {
...
@ManyToOne(fetch = FetchType.EAGER)
private OtherBean otherbean;
...
}
在HQL中,您需要指定您想要熱切地獲取關聯。
無論如何,正如@hvgotcodes所述,試圖快速獲取所有內容會導致性能問題。嘗試這樣做時,您很可能會發現自己獲取了大部分數據庫。
我建議你閱讀hibernate手冊中的Fetching Strategies以獲得毛茸茸的細節。
你可以把它變成休眠映射標籤:
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false">
但你不會得到滿意的。
順便說一句:急切的加載和加入抓取是不同的概念!兩者都不是銀子彈,以避免任何問題。
- 通常使用急切裝載可區分重N + 1個問題
- 通常使用連接取可能導致結果的重乘法。
在適當的地方使用 - 如果有疑問,請避免使用。
由Ayende Rahien看到這些相關的博客文章:
它是否熱切地獲取整個對象圖?我知道這是一個不好的方法,但我有一個情況,我真的需要它。 – helpermethod
設置lazy = false熱切加載圖形。但是它仍然需要與使用延遲加載和訪問圖中的每個對象相同數量的查詢。 –
- 1. 休眠默認Lob懶惰/渴望
- 2. 休眠@SequenceGenerator不是全球
- 3. 休眠:使用的原始渴望標識屬性
- 4. 動態渴望&懶惰在休眠加載
- 5. 休眠全球過濾標準
- 6. 瞭解對象是如何獲取在休眠渴望(非懶惰)負載
- 7. 級聯渴望加載問題
- 8. 渴望加載整個關聯?
- 9. 休眠關係
- 10. 休眠關係
- 11. 休眠:級聯型
- 12. 休眠級聯PERSIST
- 13. 休眠關聯表
- 14. 休眠ManyToMany關聯?
- 15. 休眠使聯接保存級聯
- 16. Yii2渴望負荷由關係
- 17. 渴望加載一對多關係
- 18. Paginate渴望加載的關係
- 19. 雄辯 - 渴望加載關係
- 20. Laravel:渴望加載3「關係」
- 21. Eloquent渴望加載雙關係
- 22. 渴望加載深層嵌套關係?
- 23. Laravel渴望人際關係空查詢
- 24. 我如何級聯刪除休眠
- 25. 如何確定渴望加載的關聯
- 26. 休眠OneToMany關係
- 27. 如何休眠
- 28. 如何休眠
- 29. 如何休眠
- 30. 如何渴望負載可選地存在過濾關係
有時你不希望延遲加載(例如,在我的多服務器設置)。 – rompetroll
@deadsven:我們通過使用DTO解決了所有這些問題。有一些初步的努力,但最後它試圖序列化服務器對象圖更方便。 –