JPA自动更新

示例代码:

1 DivisionalWorksType oldEntity this.divisionalWorksTypeRepository.findById(id);2 List<ScoringItemTemplate> oldList = oldEntity.getScoringItemTemplates();3 oldList.remove(0);

调用了 Repository 的 findById 办法。

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

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

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

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

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

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

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

解决:

// 应用new ArrayList 创立, 若间接应用该数据,会因为jpa自动更新而批改实体数据List<ScoringItemTemplate> oldList = new ArrayList<>(oldEntity.getScoringItemTemplates());

应用new ArrayList, 复制一份数据就能够了。