乐趣区

关于springboot:jpa-自动更新遇到的问题

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, 复制一份数据就能够了。

退出移动版