我在使用MYSQL的Spring Boot应用程序中使用Spring Data JPA。在那里,我保存了一个实体列表,对某个字段有唯一的约束。在实体列表之外,由于唯一约束,有一个实体会抛出DataIntegrityViolationException。我注意到在这种情况下没有任何实体会持续存在,即使是那些不违反唯一约束的实体。 这种情况下理想的方法应该是什么,以便那些不违反独特get的实体持续存在? 当然,我可以迭代列表并逐一保存它们。实际上,这就是SimpleJpaRepository正在做的事情。如何在保存Spring Data JPA中的列表时处理DataIntegrityVilolationException?
@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回滚。
这就是它应该如何工作 –