忽略 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 中的值对象。
使用 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 中的值对象。