我有 2 個物體Project,即File在 SpringBoot 中。這些物體的結構如下所示。
@Document(collection="project")
public class Project{
@Id
private String id;
@Field("name")
private String name;
@Field("files")
@DBRef
@JsonIgnore
private List<File> files;
}
@Document(collection="file")
public class File{
@Id
private String id;
@Field("name")
private String name;
@Field("project")
@DBRef
private Project project;
}
現在,當我創建Project物體物件時,將其保存在資料庫中并使用 Repository 從資料庫中再次獲取它并嘗試使用equals它正在回傳的方法false。當我單獨檢查每個屬性時,它List<File> files在Project. 但它會失敗是可以理解的,因為類的equals方法只有在它的每個資料成員都滿足的情況下File才會回傳,但是由于參考了,它會失敗。所以這有點像創建一個回圈。trueequalsFileProject
如果我重寫下面給出equals的 to 方法Project,它會起作用,但代價是忽略List<File> file.
@Override
public boolean equals(Object obj) {
if(obj == null)
return false;
if(!(obj instanceof Project))
return false;
if(this == obj)
return true;
Project that = (Project) obj;
return
this.id.equals(that.id) &&
this.name.equals(that.name);
}
考慮到檔案串列,如何解決這個問題?
uj5u.com熱心網友回復:
您可以覆寫 equals 方法,并僅通過在不同方法中匹配串列物件的 id 來檢查串列是否相等。或者,也許您可??以使用 containsAll() 來檢查串列元素是否相等。這不是一個完美的解決方案,但仍然檢查串列元素而不是完全忽略它們。
還要在這里檢查回圈依賴并嘗試以不同的方式構造這些物體:
https://www.baeldung.com/circular-dependencies-in-spring
uj5u.com熱心網友回復:
嘗試僅將 Project.id 保存在檔案中。我假設您需要它僅供參考。比較用例,您需要多久從檔案中查找專案或從專案中查找檔案并相應地保存。
uj5u.com熱心網友回復:
我會說你可以重新審視你的設計。開發人員經常在不需要時創建與物體(或檔案)的回圈依賴關系。
我假設您的業務案例是以下之一:
A)檔案總是與專案相關聯(沒有專案關聯就沒有檔案)
B)所有專案都包含至少一個檔案(沒有至少一個檔案的專案)
C)可以有沒有檔案的專案或沒有與之關聯的專案的檔案。
僅適用于案例 C: 您應該更喜歡回圈依賴,并且僅在業務需要時才如此。
對于案例 A 和案例 B: 您在此處有一個聚合,一個專案及其關聯的檔案串列(或具有專案的檔案)。
“聚合”是領域驅動設計中的一種模式,這兩個物件本質上可以被視為一個單元。
此外,當我們從這個角度考慮時,這些檔案(聚合)也只需要一個 repo。
您可以查看 Pivotal 的這篇演講,了解更多關于聚合的資訊:Talk on Aggregate and Spring Data JPA,來自 Pivotal
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/440040.html
