编辑:我认为我发现了一些东西:Insert after delete same transaction in Spring Data JPA
所以也许我已经知道了,但是还是欢迎更多评论!
一段代码无法正常工作,该代码想将数据列表(它们属于一个“人”)保存到数据库中,为避免重复,它首先删除了所有现有数据(人”),然后保存所有提供的数据(新旧数据可能重复),详细步骤为:
1. List<TableStructure> entries = entryMapper.toTableStructure(dtos);
2. entryDao.deleteAll(personObj.getId());
3. entryDao.saveAll(entries);
问题在于,如果要删除的先前值是[ item1 ,item2],而要保存的新值是[ item1 ,item3],则在代码后运行,只有item3将保存到数据库。 修复很简单,专家稍微改变了一下顺序,然后就可以了。新步骤:
1. entryDao.deleteAll(personObj.getId());
2. List<TableStructure> entries = entryMapper.toTableStructure(dtos);
3. entryDao.saveAll(entries);
专家的解释是:
entryMapper.toTableStructure()之后,将从数据库读取数据并提供一个ID,然后将删除和创建该项(例如, item1 ) 合并在一起,仅导致删除。
听起来合理,但我仍然想知道细节,这是什么问题?将来我应该学会什么避免这种情况?这应该是一个常见的问题,但是我找不到以前的线程,输入的关键字一定有问题,我应该搜索什么?
entryMapper还从entryDao读取数据,entryDao如下所示:
@org.springframework.stereotype.Repository
public interface Dao extends
Repository<TableStructure, Integer> {
<S extends TableStructure> S save(S toSave);
<S extends TableStructure> List<S> saveAll(Iterable<S> toSave);
@Query(SqlQuery.GET_ARTIFACT_PROPERTIES)
List<TableStructure> getData(Integer dataId);
@Modifying
@Query(SqlQuery.DELETE_ALL)
void deleteAll(Integer personId);
}