想象一下擁有一個具有不同延遲加載欄位的 JPA 物體
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "organisation_teams",
joinColumns = @JoinColumn(name = "id", referencedColumnName = "id", table = "usr_organisation"),
inverseJoinColumns = @JoinColumn(name = "team_id", referencedColumnName = "id", table = "usr_teams")
)
private Set<Team> teams = new LinkedHashSet<>();
@ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinTable(name = "organisation_associations",
joinColumns = @JoinColumn(name = "parent_id", referencedColumnName = "id", table = "usr_organisation"),
inverseJoinColumns = @JoinColumn(name = "child_id", referencedColumnName = "id", table = "organisation")
)
private Set<Organisation> children = new LinkedHashSet<>();
該物體現在由第二個服務請求,因此我們需要轉換為 DTO 并通過 REST 等方式回傳。現在可以有不同的場景,例如只需要team欄位,只需要children欄位或兩者都需要。
可以始終將它們映射到 DTO 中,在這種情況下,我認為使用延遲加載毫無意義。除了創建不同的 DTO(僅包含團隊或僅包含子欄位)和不同的 REST 端點之外,是否還有其他優雅的選擇?我不認為這也將是一個優雅的解決方案,因為您最終會得到一堆端點和 dto。
此外,團隊和組織再次具有延遲加載欄位,并且同樣的問題再次適用。
uj5u.com熱心網友回復:
我認為您正在尋找的可能是https://graphql.org/。但是對于普通的 REST 端點,我會說不同的 DTO 是要走的路,使用繼承來避免代碼重復。
如果您想提高性能而不是延遲加載相關的物體,您可以指定不同的命名物體圖,并根據 DTO 選擇一個能夠快速加載所需資料的物體。請參閱此處的檔案:https ://docs.oracle.com/javaee/7/tutorial/persistence-entitygraphs001.htm 。
不會加載任何未映射到 DTO 的延遲加載欄位。所以基本上你使用具有不同圖形和不同 DTO 的相同物體。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/513205.html
標籤:弹簧靴休眠jpa延迟加载
上一篇:AccessSQL查詢-如何包括兩個表相交日期的所有記錄,目前從查詢中排除某些行不知道為什么
下一篇:如何處理“java.lang.IllegalArgumentException:rawPassword不能為空”
