jpa 自动更新遇到的问题

JPA自动更新

示例代码:


1 DivisionalWorksType oldEntity this.divisionalWorksTypeRepository.findById(id);

2 List oldList = oldEntity.getScoringItemTemplates();

3 oldList.remove(0);

调用了 Repository 的 findById 方法。

并对其属性的数组进行了删除。

后来测试的时候,总发现该删除操作保存到了数据库中。 而并没有执行 Repository 的 save 函数。

最后发现是因为JPA的自动更新

jpa 自动更新遇到的问题_第1张图片

Hibernate文档中为Hibernate对象定义了四种状态,分别是:

  • 瞬时态(new, or transient)
  • 持久态(managed, or persistent)
  • 游状态(detached)
  • 和移除态(remove)

因为当实体对象属于托管状态下时,往这个对象里面的某个属性set新的值,这个新的值会被自动更新到数据表中去。(JPA自带的特性)

所以这就是我们没有执行save函数,数据库也会更新的原因。

解决:

// 使用new ArrayList 创建, 若直接使用该数据,会因为jpa自动更新而修改实体数据
List oldList = new ArrayList<>(oldEntity.getScoringItemTemplates());

使用new ArrayList, 复制一份数据就可以了。

你可能感兴趣的:(springboot)