如何正确管理具有 OneToOne BiDirectional 关系的关联 JPA 实体?

假设给出了 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);

有什么常见的解决方法吗?我的意思是我不想从依赖方支持协会。


当年话下
浏览 90回答 2
2回答

慕妹3146593

一种解决方法可能是使用@PrePersist. 对于这两个实体,您可以实现如下方法:掌握@PrePersistprivate void prePersist() {    if(null == getDependant().getMaster()) {        getDependant().setMaster(this);    }}依赖@PrePersistprivate void prePersist() {    if(null == getMaster().getDependant()) {        getMaster().setDependant(this);    }}或者也许只是省略空检查。

慕码人8056858

您有多种选择,但都取决于在拥有方正确设置关系,在您的情况下是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和遍历现有关系。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java