亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何正確管理具有 OneToOne BiDirectional 關系的關聯 JPA 實體?

如何正確管理具有 OneToOne BiDirectional 關系的關聯 JPA 實體?

當年話下 2022-07-20 10:11:19
假設給出了 2 個實體:master 和dependent。它們在 DB 中通常定義為dependants.master_id -> masters.id,即依賴實體持有對主實體的引用。在這種情況下,在 JPA one2one BiDirectional 關聯中通常如下所示: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);有什么常見的解決方法嗎?我的意思是我不想從依賴方支持協會。
查看完整描述

2 回答

?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

一種解決方法可能是使用@PrePersist. 對于這兩個實體,您可以實現如下方法:


掌握


@PrePersist

private void prePersist() {

    if(null == getDependant().getMaster()) {

        getDependant().setMaster(this);

    }

}

依賴


@PrePersist

private void prePersist() {

    if(null == getMaster().getDependant()) {

        getMaster().setDependant(this);

    }

}

或者也許只是省略空檢查。


查看完整回答
反對 回復 2022-07-20
?
慕碼人8056858

TA貢獻1803條經驗 獲得超6個贊

您有多種選擇,但都取決于在擁有方正確設置關系,在您的情況下是Dependant. 您的最佳選擇取決于您的需求和使用模式。例如,另一個答案討論了定義一個方法,如果 和 之間的關聯是在且僅在第一次持久化 master 時建立@PrePersist的,則該方法可能非常干凈。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;

    }


    // ...

}

這將確保當您將 a 分配Dependant給 a時Master,互惠關系會自動設置在Dependant一邊。然后,您需要確保將持久性操作指定為正確地從Master到級聯Dependant。


但是請注意,這不是靈丹妙藥。如果您將分離或刪除分配Dependant給Master. 如果您嘗試替換 a 而不明確刪除原始的(如果有),它也可能會Master失敗Dependant。還有其他方法可以打破它。


由于以非常簡單的方式管理關系需要小心和關注細節,我建議你咬緊牙關,在任何地方手動進行,如果你確實需要在堅持一個新的Master和遍歷現有關系。


查看完整回答
反對 回復 2022-07-20
  • 2 回答
  • 0 關注
  • 110 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號