我使用 Envers 来审核我的数据,有时
_MOD
的值不正确。当我在列表中添加元素时,它停留在 0
而不是 1
。但它只发生在特定情况下。
我的实体:
@Entity
@Table(name = "PERSONNE")
@Audited(withModifiedFlag = true)
public class PersonEntity {
@Id
@Column(name = "ID_PERSONNE")
private Long id;
@Column(name = "NAME", length = 100)
private String name;
@Audited( withModifiedFlag = true, modifiedColumnName = "SERVICES_MOD")
private Set<PersonneServiceEntity> services = new HashSet<>(); // Entity with attributs, gettters, setters and envers annotations...
@Audited( withModifiedFlag = true, modifiedColumnName = "OPT_INS_MOD")
private Set<OptinEntity> optIns = new HashSet<>();// Entity with attributs, gettters, setters and envers annotations...
// more fields
// + getters, setteurs, equals, tostring
我的服务:
// personFromDB is retrieve via an Id
private void update(PersonEntity personFromRequest, PersonEntity personFromDB) {
personFromDB.setName(personFromRequest.getName());
updateServices(personFromRequest, personFromDB); // add new support to the list
updateOptins(personFromRequest, personFromDB); // add new services to the list
personDao.saveAndFlush(personFromDB);
}
这就是奇迹发生的地方:当我更新
name
、services
和optIns
时。我的数据库中的值都是正确的,我的实体是正确的,除了一个envers的专栏:OPT_INS_MOD
(OPT_INS_MOD == 0
)。
但是,如果我没有更新名称(注释行),那么所有内容都会正确保留,包括所有_MOD
值(OPT_INS_MOD == 1
和SERVICES_MOD
)。
最后,如果我切换 updateSupport(personFromRequest, personFromDB)
和 updateServices(personFromRequest, personFromDB)
,在这种情况下 OPT_INS_MOD
是正确的但不是 SERVICES_MOD
.
我的猜测是当 Envers 获取所有修改的字段时出现问题。因为这对我来说没有任何意义。
有什么想法吗?我正在使用 Envers 版本 4.3.11.Final
我不确定这是否对您有帮助,因为它听起来不像是同一个问题,但我注意到修改后的标志和集合有一个奇怪之处。
我从前端返回我的实体,从 JSON 转换回 POJO。为了避免 Hibernate 出现瞬态对象错误,我需要重置 @Id 字段中的值(它从未发送到 FE)。这适用于 1-1 个实体。
关于集合,我发现如果我创建集合类的新实例并用旧集合中的刷新实体填充它,然后将该新集合分配给旧属性,则修改标志设置为 true。
但是,如果我用刷新的实体填充新集合,clear() 旧集合,然后将所有项目添加到新集合中,除非对集合进行实际更改,否则修改标志将为 false。
你找到解决这个问题的方法了吗? 我遇到了同样的问题。