簡體   English   中英

如何使用OneToOne雙向關系正確管理關聯的JPA實體?

[英]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時才建立MasterDependent之間的關聯,則該方法非常干凈。

鑒於您正在使用字段級訪問,您還可以考慮讓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方。 然后,您將要確保已指定持久性操作,以正確地從MasterDependant進行級聯。

但是請注意,這不是靈丹妙葯。 如果將分離的或移除的Dependant分配給Master ,則可能很容易卻意外地失敗。 如果您嘗試替換MasterDependant而沒有顯式刪除原始的Dependant ,則它也可能會失敗。 還有其他破解方法。

由於僅通過非常簡單的方式來管理關系需要細心和對細節的關注,我建議您硬着頭皮在任何地方手動進行,如果確實需要更多的東西,而不僅僅是在堅持新Master時建立關系並遍歷現有關系。

暫無
暫無

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

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