为了账号安全,请及时绑定邮箱和手机立即绑定

如何正确管理具有 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 关注
  • 88 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信