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, 复制一份数据就可以了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。