首页 > 解决方案 > 如果违反约束,则 CrudRepository saveAll 方法抛出异常

问题描述

我正在使用 spring data JPA 将我的数据保存到数据库中。CRUDRepository 具有我正在使用的saveAll(Iterable)方法。

由于我对实体字段有一个唯一约束,我想知道如果我尝试保存一个包含违反此约束的 Object 的 Interable 会发生什么。

标签: javahibernatespring-bootspring-data-jpa

解决方案


使用标准saveAll方法 from SimpleJpaRepository,您基本上是多次调用该save方法,每个实例一次

@Transactional
public <S extends T> List<S> saveAll(Iterable<S> entities) {
    // ... Omitted

    for (S entity : entities) {
        result.add(save(entity));
    }

    return result;
}

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

您可以看到一个EntityManager实例被使用、调用persistmerge.
这意味着它的规则适用,您将收到ConstraintViolationException


推荐阅读