我在 Profile 和 ProfileExperience 之間有一個多對多關系,映射如下:
@ManyToMany
@JoinTable(name = "profile_experience_relations",
joinColumns = {
@JoinColumn(name = "profile_id")
},
inverseJoinColumns = {
@JoinColumn(name = "profile_experience_id")
})
private List<ProfileExperience> experiences;
我在 ProfileExperience 中添加了本地化支持,如下所示:
簡介體驗班
@OneToMany(mappedBy = "profileExperience", cascade = {CascadeType.DETACH, CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}, orphanRemoval = true)
@MapKey(name = "localizedProfileExperiencePk.locale")
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
private Map<String, LocalizedProfileExperience> localizations = new HashMap<>();
LocalizedProfileExperience 類
@Entity
@Getter
@Setter
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
public class LocalizedProfileExperience {
@EmbeddedId
private LocalizedProfileExperiencePk localizedProfileExperiencePk;
@ManyToOne
@MapsId("id")
@JoinColumn(name = "profileExperienceId")
private ProfileExperience profileExperience;
private String value;
}
復合PK類
@Embeddable
@Getter
@Setter
public class LocalizedProfileExperiencePk implements Serializable {
private static final long serialVersionUID = 1L;
private String profileExperienceId;
private String locale;
public LocalizedProfileExperiencePk() {
}
但是,在添加本地化之前,回應中沒有重復條目 - 現在檢索到的所有內容都是重復的。我可以通過使用 Set 來解決這個問題,但是我很好奇為什么會這樣。解釋是什么?我可以不使用集合來解決它嗎?我是否忽略了一些非常簡單的事情?
uj5u.com熱心網友回復:
問題是您可能正在使用join fetch物體圖或物體圖來獲取嵌套集合。現在,當您查看 JDBC 結果集時,您會看到有許多重復的結果集行。如果您的個人資料有 2 個個人資料體驗,并且每個有 3 個本地化,您將看到有 6 (2 * 3) 個重復行。理論上,Hibernate 可以嘗試保留預期的物件圖基數,但這并不容易,尤其是在涉及多個集合時。此外,對于某些集合映射,它根本不可能做到。
因此,對您的問題的簡短回答是,除非重復對您很重要,否則永遠不要使用List。在這種情況下,您將有一個訂單列,因此即使那樣使用串列也是安全的。
uj5u.com熱心網友回復:
實作equal資料類的方法。休眠需要它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/505378.html
