忽略 ID 的 JaversException ENTITY_INSTANCE_WITH_NULL_ID

JaversException ENTITY_INSTANCE_WITH_NULL_ID for ignored id

使用 javers 5.11.2 我得到以下异常,尽管 id 被设置为被忽略。这是为什么?

JaversException ENTITY_INSTANCE_WITH_NULL_ID: Found Entity instance 'my.package.javers.Leaf' with null Id-property 'id'

更新:我learned那个

JaVers matches only objects with the same GlobalId

id 是使用 javax.persistence.Id 指定的。但是,对于每个 ORM,都可以有一个带有集合的实体,然后向该实体添加一个没有 id 的新元素,然后保存它 (CascadeType.Persist)。

在这种情况下,有什么方法可以将对象与 javers 进行比较吗?

示例(使用 lombok 作为样板代码)。

叶子:

@AllArgsConstructor
@NoArgsConstructor
@Builder
@Data
@Entity
public class Leaf {

    @DiffIgnore  <============ id is ignored
    @Id
    private Long id;

    private String color;

}

树:

@Builder
@Data
@Entity
public class Tree {

    @Id
    private Long id;

    private String name;

    @OneToMany
    private Set<Leaf> leafs;

}

测试向 oakSecond 添加一片叶子,但没有 id 集。无法进行差异化。抛出异常。

@Test
public void testCompare_AddLeafToTree() {
    Leaf leaf = Leaf.builder().id(1L).color("11").build();
    Set<Leaf> leafsOfOakFirst = new HashSet<>();
    leafsOfOakFirst.add(leaf);

    Tree oakFirst = Tree.builder().id(1L).name("oakFirst").build();
    oakFirst.setLeafs(leafsOfOakFirst);

    Set<Leaf> leafsOfOakSecond = new HashSet<>();
    leafsOfOakSecond.add(leaf);
    leafsOfOakSecond.add(Leaf.builder().color("12").build());

    Tree oakSecond = Tree.builder().id(1L).name("oakFirst").build();
    oakSecond.setLeafs(leafsOfOakSecond);

    Javers javers = JaversBuilder.javers().build();

    Changes changes = javers.compare(oakFirst, oakSecond).getChanges();

    assertThat(changes).isNotEmpty();
}

与 Javers 实例的以下定义相同:

EntityDefinition leafEntityDefinition = EntityDefinitionBuilder.entityDefinition(Leaf.class).withIgnoredProperties("id").build();
Javers javers = JaversBuilder.javers().registerEntity(leafEntityDefinition).build();

您不能将 ID 为空的实体传递给 Javers,因为它将是 non-identifiable。如果您使用 Hibernate 生成您的 ID,请确保在 hibernate 完成其工作后将您的对象传递给 javers.commit() 。这就是 @JaversSpringDataAuditable 方面的工作原理。

或者,您可以将那些 ID 不稳定的对象建模为 Javers 中的值对象。