我正在寻找一个解决方案,但我想不出来。我们的项目结构如下(示例(:
模块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
所有。
每当你想像这样解耦实体模型时,通常更容易接受的做法是在一个模块中有某种形式的代理实体,该实体旨在链接到或提供有关生活在其他地方的真实实体的基本信息,在你的情况下是另一个模块。
换句话说:
人员模块
- 个人实体
- 汽车实体(代理模型(
车载模块
- 汽车实体
- 潜在的个人实体(代理模型(
然后,当真实实体发生变化时,使用类似Debezium或其他触发器/钩子的东西来通知其他模块,以便其代理模型能够反映这些变化。这将允许您从单个模块中获得审计模型的完整视图,而不是试图在多个模块中获得这一视图,从而从一开始就有效地取消了分离的目标。
这些"代理"模型之所以重要,是因为它允许一个模块的实体模型随着时间的推移而变化,而对可能只需要原始数据子集的相邻模块的实体模式几乎没有影响。
另一种选择是退一步,意识到也许你试图以一种不符合对象模型和关系的方式将数据拆分为模块,因此,考虑到实体模型中最初存在的环境和关系,你所拥有的是可以接受的。
我的问题是,当我更新汽车时,没有为我的个人创建记录,但我想要一个。有可能吗?
在您的第二个映射模型中,不,这是不可能的。原因是在这种情况下,关系仅由Person
实体拥有,并且Car
的审计模型根本不知道它与Person
的审计模型有任何关联,因为模型中没有反向(非拥有(映射。
使用这样的实体映射,唯一可行的方法是在修改Person
时,需要更改Car
模型上的某些属性,以便触发该实体的审计条目。自然,这样做首先与将这些分离的整个过程相矛盾,因此,通过评论接受这些需要共存的替代方案。