将ID为NULL的实体视为新

时间:2017-08-17 12:22:27

标签: javers

问题"与实体ID保存差异"我找到了以下答案:

"对于Entities,Id属性不能为null,因此您需要将此类映射为ValueObject。如果是这样, Id属性被视为常规属性,它不会转到此对象的GlobalId。"

我的问题是:

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

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

  1. 两次提交,在第二次提交中有一个新实体(Id NULL)
  2. 获取更改=>因为Javers无法创建GlobalId。
  3. 我可以通过执行EntityManager来实现这一点 - 持久化(创建Id:s),但我想避免这样做。现在的代码可以稍后保留,或者只是让事务完成。

    因为Id为NULL,所以实体为NEW。是否可以生成unigue temp Id(允许Id = NULL)以创建GlobalId? 在更改列表中,实体将报告为NEW。无需与之前的提交进行比较。

1 个答案:

答案 0 :(得分:0)

当你的对象完全初始化时,你应该比较/提交你的对象,所以当它们有ID时。

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

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

如果您正在使用Hibernate,请在Hibernate从序列中分配ID后比较/提交新对象。

另一种选择:

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