0

对于“使用实体 ID 保存差异”这个问题,我找到了以下答案:

“对于实体,Id 属性不能为 null,因此您需要将此类映射为 ValueObject。如果是,则 Id 属性被视为常规属性,它不会转到该对象的 GlobalId。”

我的问题是:

如果 Id 为 NULL,为什么不能将实体视为 NEW?

我有一个从数据库中获取的对象图,在两个 javers 提交之间,一个实体被添加到图中的列表中。

  1. 两次提交,在第二次提交中有一个新实体(Id NULL)
  2. 获取更改 => 例外,因为 Javers 无法创建 GlobalId。

我可以通过执行 EntityManager 来解决这个问题 - 持久化(创建 Id:s),但我想避免这样做。当前的代码可能会在稍后进行持久化,或者它只是让事务完成。

因为 Id 为 NULL,所以实体是 NEW。是否可以生成一个唯一的临时 Id(允许 Id = NULL)来创建 GlobalId?在更改列表中,实体将被报告为 NEW。无需与较早的提交进行比较。

4

1 回答 1

1

您应该在它们完全初始化时比较/提交您的对象,以便当它们具有 Id 时。

JaVers 无法处理没有 Id 的实体,原因如下:

  • 无法与其他实体/版本进行比较(差异算法基于 GlobalIds)
  • 无法从 JaVersRepository 查询(查询使用 GlobalIds)

如果您使用的是 Hibernate,请在 Hibernate 从序列中为其分配 Id 后比较/提交您的新对象。

另一种选择:

  • 不要使用序列生成的值作为 JaVers Id,而是使用一些业务标识符
  • 如果实体没有业务标识符,您可以在构造函数中生成 UUID 并将其用作 JaVers id(如果您愿意,还可以使用数据库 PK)
于 2017-08-23T13:03:49.140 回答