我有一个简单的程序,其中包含这样的资源和项目选择列表
@Audited
@Table(name = "resource_item")
public class Resource {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Access(AccessType.PROPERTY)
private Long id;
private String nom;
@ElementCollection(targetClass = ItemSelection.class)
@CollectionTable(name = "item_selection", joinColumns = @JoinColumn(name = "resource_id"))
@OrderColumn(name = "list_order")
private final List<ItemSelection> itemSelections = new ArrayList<>();
...
...
@Embeddable
@Access(AccessType.FIELD)
public class ItemSelection {
//@Column(name = "hierarchy_code", nullable = false)
private String hierarchyCode;
//@Column(name = "hierarchy_level", nullable = false)
private int hierarchyLevel;
//@Column(name = "hierarchy_value_code", nullable = false)
private String hierarchyValueCode;
...
...
当我在 itemSelections 中添加包含 3 个元素的资源时,hibernate envers 正确记录:
localhost sa@envers=# select * from item_selection_aud ;
rev | revtype | resource_id | list_order | hierarchy_value_code | hierarchy_code | hierarchy_level
-----+---------+-------------+------------+----------------------+----------------+-----------------
2 | 0 | 1 | 1 | hvalueCode3 | hcode3 | 3
2 | 0 | 1 | 0 | hvalueCode1 | hcode1 | 1
2 | 0 | 1 | 2 | hvalueCode2 | hcode2 | 2
(3 rows)
当我更新 item_selection 中的一行时,我只在 sql 中看到一项更新,但 hibernate envers 会记录以下内容:
localhost sa@envers=# select * from item_selection_aud ;
rev | revtype | resource_id | list_order | hierarchy_value_code | hierarchy_code | hierarchy_level
-----+---------+-------------+------------+----------------------+----------------+-----------------
2 | 0 | 1 | 1 | hvalueCode3 | hcode3 | 3
2 | 0 | 1 | 0 | hvalueCode1 | hcode1 | 1
2 | 0 | 1 | 2 | hvalueCode2 | hcode2 | 2
3 | 0 | 1 | 0 | hvalueCode1 | CODE | 1
3 | 2 | 1 | 0 | hvalueCode1 | hcode1 | 1
(5 rows)
如您所见,我有用于修改行的 revtype 2 和 0,而不是用于更新的 revtype 1。
我尝试使用 @Column(name = "hierarchy_code", nullable = false) 但没有任何改变。
目前我唯一的解决方案是将@ElementCollection转换为@OneToMany,但是我的应用程序中有很多@ElementCollection,所以重构太多了......
我是否遗漏了配置中的某些内容?我正在使用 DefaultAuditStrategy,其行为与 ValidityAuditStrategy 相同,仅添加 revend 列。 Hibernate-envers 5.6.12-Final
这是预期的行为。 Hibernate 无法更新没有 ID 的项目,对于 ElementCollection,它通常会删除旧行并插入修改项目的新行。