【问题标题】:Can I mix both update and insert in saveAll from JpaRepository我可以在 JpaRepository 的 saveAll 中混合更新和插入吗
【发布时间】:2019-12-24 08:59:31
【问题描述】:

我使用 Spring Boot 和 Spring Data JPA 以及 Hibernate 作为持久性提供程序。我用JPARepository 扩展了我的Repository 接口。我有一个表的实体 Bean 列表。其中一些已经存在,而另一些则不存在。

我想知道当我从我的服务层调用saveAll 并传递这个List 时会发生什么?

【问题讨论】:

    标签: java spring hibernate jpa spring-data-jpa


    【解决方案1】:

    如果您查看SimpleJpaRepository,它是CrudRepository 的常见实现,您会发现它只会为每个元素调用 save:

    @Transactional
    public <S extends T> List<S> saveAll(Iterable<S> entities) {
    
        Assert.notNull(entities, "The given Iterable of entities not be null!");
    
        List<S> result = new ArrayList<S>();
    
        for (S entity : entities) {
            result.add(save(entity));
        }
    
        return result;
    }
    

    无论是persist 还是merge 给定实体,保存本身都会区分:

    @Transactional
    public <S extends T> S save(S entity) {
    
        if (entityInformation.isNew(entity)) {
            em.persist(entity);
            return entity;
        } else {
            return em.merge(entity);
        }
    }
    

    所以回答您的问题.. 是的,您可以在通行证列表中混合新实体和现有实体。

    【讨论】:

    • 一个奇怪的问题是 saveAll 不能准确地确定实体是否是新的。这会导致记录重复。
    猜你喜欢
    • 2013-07-19
    • 1970-01-01
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    相关资源
    最近更新 更多