![](/img/trans.png)
[英]Hibernate: Doman Model to JPA Entity/DTO & Merge() Design pattern or best practice
[英]DTO pattern with JPA hibernate
我正在關注有關 DTO 的本教程並檢查將實體轉換為 DTO 的方法。 我想知道懶惰關系是什么意思,如果在將其轉換為DTO的那一刻,我需要獲取數據才能將其設置到DTO類中? 我總是需要先獲取數據,那么我設置它是lazy 還是eager 有關系嗎?
在延遲加載中,僅當顯式調用子類的 getter 時才加載子類值。 但是對於急切加載,在調用父類時,它的所有子類都已經加載了值。 與延遲加載相比,快速加載速度更慢並且消耗更多內存。
我建議你把你的觀點從“我的 DTO 需要什么”上移開,因為這會影響判斷。
渴望與懶惰是“我需要多久加載一次關系”與“加載關系需要多少成本”之間的設計權衡?
舉個極端的例子。 您有一個持久實體,例如Region
。 一個Region
與居住在這個Region
所有人( Person
實體)都有關系。 並且人們( Person
)可以相互認識。
假設您eager
獲取此實體圖中的所有內容,並且您需要加載屏幕的所有區域(不是人,只有區域)。
加載所有Region
都會熱切加載所有Person
生活在那里。 但是由於人們彼此認識並且這也將被急切地加載,然后您將整個數據庫加載到內存中只是為了顯示區域。
將整個數據庫加載到內存中通常是不可接受的成本。
等待。 還有更糟的。
假設我想編輯一個Person
。 所以我加載它。 這會急切地獲取Person
的Region
。 它急切地獲取該區域中的所有Person
實例。 並且它還會獲取這個人知道的所有其他Person
,進而獲取其他Person
的Region
,並且一直向下遞歸。
即使對於單個Perosn
我也再次加載了整個數據庫。
這是否意味着你永遠不應該急切地獲取? 不。
它的意思是:當您知道經常需要數據時,您可以將預先提取放在一起,並且您可以直接或間接控制提取將產生的數據量。
這就是危險所在:不要為單個實體加載整個 2 億行表。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.