Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Spring Data JPA中保存列表时处理DataIntegrityFillationException?_Spring_Hibernate_Spring Data Jpa - Fatal编程技术网

如何在Spring Data JPA中保存列表时处理DataIntegrityFillationException?

如何在Spring Data JPA中保存列表时处理DataIntegrityFillationException?,spring,hibernate,spring-data-jpa,Spring,Hibernate,Spring Data Jpa,我在一个Spring引导应用程序中使用Spring数据JPA和MYSQL。在这里,我保存了一个字段上具有唯一约束的实体列表。在实体列表中,有一个实体由于唯一约束将抛出DataIntegrityViolationException。我注意到,在这种情况下,没有一个实体得到持久化,即使那些没有违反惟一约束的实体也是如此。 在这种情况下,理想的方法应该是什么,以便那些不违反唯一性的实体得到持久化? 当然,我可以迭代列表并逐个保存它们。事实上,这就是SimpleParepository在下面所做的 @T

我在一个Spring引导应用程序中使用Spring数据JPA和MYSQL。在这里,我保存了一个字段上具有唯一约束的实体列表。在实体列表中,有一个实体由于唯一约束将抛出DataIntegrityViolationException。我注意到,在这种情况下,没有一个实体得到持久化,即使那些没有违反惟一约束的实体也是如此。 在这种情况下,理想的方法应该是什么,以便那些不违反唯一性的实体得到持久化? 当然,我可以迭代列表并逐个保存它们。事实上,这就是SimpleParepository在下面所做的

@Transactional
public <S extends T> List<S> save(Iterable<S> entities) {

    List<S> result = new ArrayList<S>();

    if (entities == null) {
        return result;
    }

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

    return result;
}
存储库:

public interface SampleContentRepository extends JpaRepository<SampleContent, Serializable>{
公共接口SampleContentRepository扩展了JpaRepository{
}

JUnit测试:

@Test
public void testCreate(){
    List<SampleContent> sampleContentList =  new ArrayList<>();
    SampleContent sampleContent1 = new SampleContent();
    sampleContent1.setName("dd");
    SampleContent sampleContent2 = new SampleContent();
    sampleContent2.setName("Roy");
    SampleContent sampleContent3 = new SampleContent();
    sampleContent3.setName("xx");
    sampleContentList.add(sampleContent1);
    sampleContentList.add(sampleContent2);
    sampleContentList.add(sampleContent3);
    try{
        this.sampleContentRepository.save(sampleContentList);
    }catch(DataIntegrityViolationException e){
        System.err.println("constraint violation!");
    }
}
@测试
公共void testCreate(){
List sampleContentList=新的ArrayList();
SampleContent sampleContent1=新的SampleContent();
样本内容1.集合名称(“dd”);
SampleContent sampleContent2=新的SampleContent();
样本内容2.集合名称(“Roy”);
SampleContent sampleContent3=新的SampleContent();
sampleContent3.setName(“xx”);
添加(sampleContent1);
添加(sampleContent2);
添加(sampleContent3);
试一试{
这个.sampleContentRepository.save(sampleContentList);
}捕获(DataIntegrityViolationException e){
System.err.println(“约束冲突!”);
}
}

表中已存在名为“Roy”的实体。因此,整个事务失败,@Transactional回滚。

我认为您可以使用以下步骤:

  • 将现有实体从DB加载到集合中
  • 基于
    name
  • 调用
    Set::addAll
    您可以一个一个地添加它们
  • 设置
    保存为DB
  • 也许这是次优的,因为它迫使您进行
    select*
    查询。但我认为它比将实体逐个保存到DB更有效


    鉴于此,您可以使用名称作为您的业务密钥,这有很多好处

    我认为您可以使用以下步骤:

  • 将现有实体从DB加载到集合中
  • 基于
    name
  • 调用
    Set::addAll
    您可以一个一个地添加它们
  • 设置
    保存为DB
  • 也许这是次优的,因为它迫使您进行
    select*
    查询。但我认为它比将实体逐个保存到DB更有效


    鉴于此,您可以使用名称作为您的业务密钥,这有很多好处

    这是一种方法。但正如你所指出的,这将是次优的。我的桌子上有一百万条记录。我使用的实体覆盖了equals和hashcode,我将它们放入一个集合中。我想知道,是否有任何方法可以捕获约束冲突异常并继续处理其他实体。我认为没有其他方法,只能遍历整个列表。谢谢:)您始终可以创建查询,如
    从名称所在的表中选择不同的名称(:您的\u名称列表\u要添加)
    。然后从上一次选择的结果中筛选出名为的集合项。希望您不必从数据库加载大量数据。这是一种方法。但正如你所指出的,这将是次优的。我的桌子上有一百万条记录。我使用的实体覆盖了equals和hashcode,我将它们放入一个集合中。我想知道,是否有任何方法可以捕获约束冲突异常并继续处理其他实体。我认为没有其他方法,只能遍历整个列表。谢谢:)您始终可以创建查询,如
    从名称所在的表中选择不同的名称(:您的\u名称列表\u要添加)
    。然后从上一次选择的结果中筛选出名为的集合项。希望您不必从数据库加载大量数据。这就是它的工作原理,这就是它的工作原理
    @Test
    public void testCreate(){
        List<SampleContent> sampleContentList =  new ArrayList<>();
        SampleContent sampleContent1 = new SampleContent();
        sampleContent1.setName("dd");
        SampleContent sampleContent2 = new SampleContent();
        sampleContent2.setName("Roy");
        SampleContent sampleContent3 = new SampleContent();
        sampleContent3.setName("xx");
        sampleContentList.add(sampleContent1);
        sampleContentList.add(sampleContent2);
        sampleContentList.add(sampleContent3);
        try{
            this.sampleContentRepository.save(sampleContentList);
        }catch(DataIntegrityViolationException e){
            System.err.println("constraint violation!");
        }
    }