删除并再次插入的行无法插入

时间:2019-08-22 03:02:07

标签: java spring transactions repository

编辑:我认为我发现了一些东西: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);
    }

0 个答案:

没有答案