簡體   English   中英

帶有 JPA 休眠的 DTO 模式

[英]DTO pattern with JPA hibernate

我正在關注有關 DTO 的本教程並檢查將實體轉換為 DTO 的方法。 我想知道懶惰關系是什么意思,如果在將其轉換為DTO的那一刻,我需要獲取數據才能將其設置到DTO類中? 我總是需要先獲取數據,那么我設置它是lazy 還是eager 有關系嗎?

在延遲加載中,僅當顯式調用子類的 getter 時才加載子類值。 但是對於急切加載,在調用父類時,它的所有子類都已經加載了值。 與延遲加載相比,快速加載速度更慢並且消耗更多內存。

我建議你把你的觀點從“我的 DTO 需要什么”上移開,因為這會影響判斷。

渴望與懶惰是“我需要多久加載一次關系”與“加載關系需要多少成本”之間的設計權衡?

舉個極端的例子。 您有一個持久實體,例如Region 一個Region與居住在這個Region所有人( Person實體)都有關系。 並且人們( Person )可以相互認識。

假設您eager獲取此實體圖中的所有內容,並且您需要加載屏幕的所有區域(不是人,只有區域)。

加載所有Region都會熱切加載所有Person生活在那里。 但是由於人們彼此認識並且這也將被急切地加載,然后您將整個數據庫加載到內存中只是為了顯示區域。

將整個數據庫加載到內存中通常是不可接受的成本。

等待。 還有更糟的。

假設我想編輯一個Person 所以我加載它。 這會急切地獲取PersonRegion 它急切地獲取該區域中的所有Person實例。 並且它還會獲取這個人知道的所有其他Person ,進而獲取其他PersonRegion ,並且一直向下遞歸。

即使對於單個Perosn我也再次加載了整個數據庫。

這是否意味着你永遠不應該急切地獲取? 不。

它的意思是:當您知道經常需要數據時,您可以將預先提取放在一起,並且您可以直接或間接控制提取將產生的數據量。

這就是危險所在:不要為單個實體加載整個 2 億行表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM