Hibernate envers 和 ElementCollection

问题描述 投票:0回答:1

我有一个简单的程序,其中包含这样的资源和项目选择列表

@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

java hibernate-envers
1个回答
0
投票

这是预期的行为。 Hibernate 无法更新没有 ID 的项目,对于 ElementCollection,它通常会删除旧行并插入修改项目的新行。

© www.soinside.com 2019 - 2024. All rights reserved.