如何在Spring Data JPA中保存列表时处理DataIntegrityFillationException?
我在一个Spring引导应用程序中使用Spring数据JPA和MYSQL。在这里,我保存了一个字段上具有唯一约束的实体列表。在实体列表中,有一个实体由于唯一约束将抛出DataIntegrityViolationException。我注意到,在这种情况下,没有一个实体得到持久化,即使那些没有违反惟一约束的实体也是如此。 在这种情况下,理想的方法应该是什么,以便那些不违反唯一性的实体得到持久化? 当然,我可以迭代列表并逐个保存它们。事实上,这就是SimpleParepository在下面所做的如何在Spring Data JPA中保存列表时处理DataIntegrityFillationException?,spring,hibernate,spring-data-jpa,Spring,Hibernate,Spring Data Jpa,我在一个Spring引导应用程序中使用Spring数据JPA和MYSQL。在这里,我保存了一个字段上具有唯一约束的实体列表。在实体列表中,有一个实体由于唯一约束将抛出DataIntegrityViolationException。我注意到,在这种情况下,没有一个实体得到持久化,即使那些没有违反惟一约束的实体也是如此。 在这种情况下,理想的方法应该是什么,以便那些不违反唯一性的实体得到持久化? 当然,我可以迭代列表并逐个保存它们。事实上,这就是SimpleParepository在下面所做的 @T
@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回滚。我认为您可以使用以下步骤:
name
Set::addAll
您可以一个一个地添加它们设置保存为DB
select*
查询。但我认为它比将实体逐个保存到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!");
}
}