[英]How to properly manage associated JPA entities with OneToOne BiDirectional relation?
假設有兩個實體:主實體和從屬實體。
它們通常在DB中定義,就像dependants.master_id -> masters.id
,即,從屬實體持有對主實體的引用。
在這種情況下,在JPA one2one雙向關聯中通常如下所示:
class Master {
@OneToOne(mappedBy="master")
Dependant dependant
}
class Dependant {
@OneToOne
@JoinColumn("master_id")
Master master
}
這種方法導致必須處理關系的雙方,例如:
Master master = new Master();
Dependant dependant = new Dependant();
dependant.setMaster(master);
master.setDependant(dependant);
repository.save(master);
而不是像這樣更直觀,更接近業務邏輯:
Master master = new Master();
Dependant dependant = new Dependant();
master.setDependant(dependant);
repository.save(master);
有什么通用的解決方法嗎? 我的意思是我不想從依賴方支持協會。
一種解決方法是使用@PrePersist
。 對於這兩個實體,您可以實現以下方法:
主
@PrePersist
private void prePersist() {
if(null == getDependant().getMaster()) {
getDependant().setMaster(this);
}
}
依賴的
@PrePersist
private void prePersist() {
if(null == getMaster().getDependant()) {
getMaster().setDependant(this);
}
}
或者也許只是省略空檢查。
您有多個選項,但是所有選項都取決於在擁有方正確設置關系,在您的情況下,這是Dependant
。 最佳選擇取決於您的需求和使用方式。 例如,另一個答案討論了定義@PrePersist
方法,如果僅當首次保留master時才建立Master
和Dependent
之間的關聯,則該方法非常干凈。
鑒於您正在使用字段級訪問,您還可以考慮讓Master.setDependant()
為您完成工作:
class Master {
// ...
@OneToOne(mappedBy="master")
private Dependant dependant;
public void setDependant(Dependant dep) {
if (dep != null) {
dep.setMaster(this);
} else if (dependant != null) {
// leaves a dangling dependant ...
dependant.setMaster(null);
}
dependant = dep;
}
// ...
}
這將確保當你將一個Dependant
於一個Master
,倒數關系是自動建立的Dependant
方。 然后,您將要確保已指定持久性操作,以正確地從Master
到Dependant
進行級聯。
但是請注意,這不是靈丹妙葯。 如果將分離的或移除的Dependant
分配給Master
,則可能很容易卻意外地失敗。 如果您嘗試替換Master
的Dependant
而沒有顯式刪除原始的Dependant
,則它也可能會失敗。 還有其他破解方法。
由於僅通過非常簡單的方式來管理關系需要細心和對細節的關注,我建議您硬着頭皮在任何地方手動進行,如果確實需要更多的東西,而不僅僅是在堅持新Master
時建立關系並遍歷現有關系。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.