当前位置: 首页 > 知识库问答 >
问题:

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

沈伟
2023-03-14

我在MYSQL的Spring Boot应用程序中使用Spring数据JPA。在那里,我保存了一个字段上具有唯一约束的实体列表。在实体列表中,有一个实体将由于唯一约束而抛出DataWellityViolationExcure。我注意到在这种情况下,没有一个实体被持久化,即使是那些不违反唯一约束的实体。在这种情况下,什么是理想的方法,让那些不违反唯一约束的实体被持久化?当然,我可以迭代列表并一个接一个地保存它们。事实上,这就是SimpleJpaRepository在下面所做的。

@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;
}

我的代码-实体:

@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = { "name" }, name = "uq_name"))
public class SampleContent {
    @Id
    @GeneratedValue
    private Long id;

    private String name;
    //getter setters 
}

存储库:

public interface SampleContentRepository extends JpaRepository<SampleContent, Serializable>{

}

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!");
    }
}

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

共有1个答案

郭博涉
2023-03-14

我认为你可以采取以下步骤:

  1. 将现有实体从数据库加载到集合中
  2. 基于name
  3. 调用Set::addAllyou antities(或者一个接一个地添加它们)
  4. 保存设置为DB

也许它是次优的,因为它迫使您进行选择*查询。但是我认为它比一个接一个地将实体保存到数据库中更有效。

根据本文,您可以使用名称作为业务密钥,这有很多好处。

 类似资料:
  • 我有一个spring-boot-starter-data-cassandra版本为2.1.2.release的Spring Boot应用程序。需要理解spring data Cassandra在执行insert选项时如何在实体中内部处理null。使用方法持久化这些实体。在某些情况下,这些实体的少数字段可能为空。这种方法是否会影响Cassandra的性能或墓碑可能在Cassandra中创建。或者请建

  • 我已经尝试将JSON响应添加到Realm数据库中。我通过GSON处理响应,然后尝试转换为realm。我已经为我的响应模型类扩展了RealmObject。我还使用RealmString类通过RealmList处理列表。但当我尝试将GSON应用到领域对象时,我会出错。我正在寻找一个这样的例子,如果有人有一个。感谢所有支持。下面是我的JSON回复。

  • 问题内容: 我的对象是: 函数的类别是: 当我尝试使用此功能时: 它不和我一起工作,有帮助吗?!!! 问题答案: 我用这个类来解决这个问题: 然后我用这个功能来使用它

  • 我有以下API调用 失败是因为 现在我明白了,我必须多次调用以删除Cloud watch的Insight规则,每20个块。 所以从概念上来说,我在寻找 现在,我在java 8 streams api中找不到任何允许我将列表分块处理的东西。有点像scala分组功能将列表拆分为多个元素数目固定的列表。 有人能帮我解决这个问题吗?谢谢当然,我可以使用命令式样式和子列表,但如果可以的话,我宁愿避免这样做。

  • 我尝试通过像这样更改if语句来只获得最长的回文。 这并不像预期的那样有效。我只打印第一个回文[“w”],然后在列表中返回整个字符串[“w”,“h”,...]

  • 有时我使用filter,如您所见,有时如果需要,我使用distinct/sort。但是我仍然有很多运行时错误。 我会很乐意提供一些如何处理它的技巧。 @cricket_007 我的代码: 所以基本上,当我试图用嵌套循环解决这个任务时,我得到了O(n^2)的算法复杂度。如何解决?