Hibernate cascade all 和 envers 审计
Hibernate cascade all and envers audit
我正在寻找解决方案,但我想不通。
我们的项目结构如下(示例):
模块 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;
}
我们想要做的是将实体和服务分开 link 在不同的模块中。例如:
人员模块
- 人
车载模块
- 汽车
我们希望在实体上保留 Cascade。但是我们不想有循环依赖。
我们删除了 link From Car to Person
@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;
}
我的问题是当我更新汽车时,没有为我的个人创建记录,但我想要一个。
可能吗?
What we want to do is separate the entities and services linked in different modules.
现实情况是您的解决方案在技术上并未这样做,两个实体之间的关联仍然存在。在前一个映射中,双方都拥有协会,而在后者中,它由 Person
.
单独拥有
每当您想像这样解耦实体模型时,通常更容易接受的做法是在一个模块中使用某种形式的代理实体,这意味着 link 到 或提供有关其他地方真实实体的基本信息,在您的情况下是另一个模块。
换句话说:
人物模块
- 个人实体
- 汽车实体(代理模型)
车载模块
- 汽车实体
- 可能是一个 Person 实体(代理模型)
当时的想法是使用 Debezium 或其他 trigger/hook 之类的东西在真实实体发生变化时通知其他模块,以便其代理模型可以反映变化。这样一来,您就可以从单个模块中获得审计模型的完整视图,而不是试图跨多个模块获得审计模型,这首先会有效地抵消您的分离目标。
这些 "proxy" 模型之所以重要,是因为它允许一个模块的实体模型随时间变化,而对可能只需要原始数据的一个子集的相邻模块的影响很小或没有影响。
另一种选择是退后一步,意识到也许您正在尝试以不适合您的对象模型和关系的方式将数据拆分为模块,因此您所拥有的是可以接受的首先考虑实体模型中存在的情况和关系。
My problem is when I update a car, no record is created for my Person, but I want one. Is it possible ?
在您的第二个映射模型中,不,这是不可能的。原因是在这种情况下,关系仅由 Person
实体所有,Car
的审计模型根本不知道它与 Person
的审计模型有任何关联因为模型中没有反向(非拥有)映射。
使用这样的实体映射,唯一可行的方法是在修改 Person
时需要更改 Car
模型上的某些属性,以便触发审计该实体的条目。这样做自然会与首先将它们分开的整个过程相矛盾,因此通过评论接受这些需要共存的替代方案。
我正在寻找解决方案,但我想不通。 我们的项目结构如下(示例):
模块 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;
}
我们想要做的是将实体和服务分开 link 在不同的模块中。例如:
人员模块
- 人
车载模块
- 汽车
我们希望在实体上保留 Cascade。但是我们不想有循环依赖。 我们删除了 link From Car to Person
@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;
}
我的问题是当我更新汽车时,没有为我的个人创建记录,但我想要一个。 可能吗?
What we want to do is separate the entities and services linked in different modules.
现实情况是您的解决方案在技术上并未这样做,两个实体之间的关联仍然存在。在前一个映射中,双方都拥有协会,而在后者中,它由 Person
.
每当您想像这样解耦实体模型时,通常更容易接受的做法是在一个模块中使用某种形式的代理实体,这意味着 link 到 或提供有关其他地方真实实体的基本信息,在您的情况下是另一个模块。
换句话说:
人物模块
- 个人实体
- 汽车实体(代理模型)
车载模块
- 汽车实体
- 可能是一个 Person 实体(代理模型)
当时的想法是使用 Debezium 或其他 trigger/hook 之类的东西在真实实体发生变化时通知其他模块,以便其代理模型可以反映变化。这样一来,您就可以从单个模块中获得审计模型的完整视图,而不是试图跨多个模块获得审计模型,这首先会有效地抵消您的分离目标。
这些 "proxy" 模型之所以重要,是因为它允许一个模块的实体模型随时间变化,而对可能只需要原始数据的一个子集的相邻模块的影响很小或没有影响。
另一种选择是退后一步,意识到也许您正在尝试以不适合您的对象模型和关系的方式将数据拆分为模块,因此您所拥有的是可以接受的首先考虑实体模型中存在的情况和关系。
My problem is when I update a car, no record is created for my Person, but I want one. Is it possible ?
在您的第二个映射模型中,不,这是不可能的。原因是在这种情况下,关系仅由 Person
实体所有,Car
的审计模型根本不知道它与 Person
的审计模型有任何关联因为模型中没有反向(非拥有)映射。
使用这样的实体映射,唯一可行的方法是在修改 Person
时需要更改 Car
模型上的某些属性,以便触发审计该实体的条目。这样做自然会与首先将它们分开的整个过程相矛盾,因此通过评论接受这些需要共存的替代方案。