【发布时间】:2015-12-17 21:52:41
【问题描述】:
我在 Spring Boot 应用程序中使用 Spring Data JPA 和 MYSQL。在那里,我正在保存一个对字段具有唯一约束的实体列表。在实体列表中,有一个实体会由于唯一约束而引发 DataIntegrityViolationException。我注意到在这种情况下没有一个实体被持久化,即使是那些不违反唯一约束的实体。 在这种情况下,理想的方法应该是什么,以便那些不违反唯一性的实体得到持久化? 当然我可以迭代列表并一一保存。事实上这就是 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 回滚。
【问题讨论】:
-
它应该是这样工作的
标签: spring hibernate spring-data-jpa