【问题标题】:Hibernate cascade all and envers auditHibernate级联所有和envers审计
【发布时间】:2020-03-25 21:33:54
【问题描述】:

我正在寻找解决方案,但我无法弄清楚。 我们的项目结构是这样的(一个例子):

模块 1:

  • 汽车
    @Audited
    public class Person {
        int id;
        String firstName;
        String lastName;

        @JoinColumn(name = "car_id", referencedColumnName = "id", nullable = false)
        @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
        List<Car> cars;
    }

    @Audited
    public class Car {
        String model;
        @ManyToOne(fetch = FetchType.LAZY)
        Person person;
    }

我们要做的是将不同模块中链接的实体和服务分开。例如:
人物模块

汽车模块

  • 汽车

我们希望在实体上保留 Cascade。但是我们不希望有循环依赖。 我们删除了从汽车到人的链接

    @Audited
    public class Person {
        int id;
        String firstName;
        String lastName;

        @JoinColumn(name = "car_id", referencedColumnName = "id", nullable = false)
        @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL, orphanRemoval = true)
        List<Car> cars;
    }

    @Audited
    public class Car {
        String model;
    }

我的问题是当我更新汽车时,没有为我的 Person 创建记录,但我想要一个。 有可能吗?

【问题讨论】:

    标签: hibernate-envers


    【解决方案1】:

    我们要做的是将不同模块中链接的实体和服务分开。

    现实是您的解决方案在技术上并没有这样做,两个实体之间的关联仍然存在。在前一个映射中,双方都拥有该协会,而在后者中,它由Person单独拥有。

    每当您想像这样解耦实体模型时,通常更可接受的做法是在一个模块中拥有某种形式的代理实体,旨在链接到或提供有关真实实体的基本信息生活在其他地方的实体,在你的情况下是另一个模块。

    换句话说:

    人物模块

    • 个人实体
    • 汽车实体(代理模型)

    汽车模块

    • 汽车实体
    • 可能是 Person 实体(代理模型)

    然后的想法是使用类似 Debezium 或其他触发器/钩子之类的东西来在真实实体发生更改时通知其他模块,以便其代理模型可以反映更改。这样您就可以从单个模块中获得审计模型的完整视图,而不是尝试跨多个模块获取该模型,从而有效地首先使您的分离目标无效。

    这些“代理”模型之所以重要,是因为它允许一个模块的实体模型随时间变化,而对可能只需要原始数据子集的相邻模块几乎没有影响。

    另一种选择是退后一步,意识到您可能正在尝试以不适合您的对象模型和关系的方式将数据拆分为模块,因此您所拥有的内容是可以接受的首先存在于实体模型中的情况和关系。

    我的问题是当我更新汽车时,没有为我的 Person 创建记录,但我想要一个。有可能吗?

    在您的第二个映射模型中,不,这是不可能的。这样做的原因是,在这种情况下,该关系仅由 Person 实体拥有,Car 的审计模型不知道它与 Person 的审计模型有任何关联,因为没有逆 (模型中的非拥有)映射。

    使用这样的实体映射,唯一可行的方法是在修改 Person 时需要更改 Car 模型上的某些属性,以便触发该实体的审计条目。自然地,这样做与首先将它们分开的整个过程相矛盾,因此通过评论接受这些需要共存的替代方案。

    【讨论】:

      猜你喜欢
      • 2023-03-24
      • 1970-01-01
      • 2015-12-14
      • 2012-12-05
      • 2016-11-15
      • 2018-04-18
      • 2018-09-19
      • 2013-06-03
      • 2015-08-20
      相关资源
      最近更新 更多