我有一个DB(Postgres)表,其中一列有唯一约束。我有一个标有@Transactional注释的测试,它将该唯一列值更新为非唯一值。我希望更新操作失败,但它会成功执行。此外,当我从数据库中获取更新对象(在同一事务内)时,列值将在那里更新。
JPA实体的简化版本:
@Entity
@Table(name = "entities")
public class Entity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id")
private Long id;
// The unique column
@Column(name = "name", unique = true)
@NotNull
private String name;
...
}
测试的简化版本:
@Test
@Transactional
public void test() {
Entity firstEntity = new Entity();
firstEntity.setName("First Entity Name");
// This just calls corresponding JPA repository .save method
entityService.create(firstEntity);
Entity secondEntity = new Entity();
secondEntity.setName("Second Entity Name");
entityService.create(secondEntity);
// Update name to a not unique value
secondEntity.setName(firstEntity.getName);
// This calls corresponding JPA repository .save method.
// It also catches DataIntegrityViolationException and throws
// a more user friendly exception instead
entityService.update(secondEntity);
}
如果删除@Transactional注释或提交事务,此代码可以正常工作。我也尝试按照建议here调用EntityManager.flush(),但是这个代码在刷新结果数据后抛出ConstraintViolationException,因此我无法测试我的entityService.update方法是否正常工作并抛出正确的异常。 / p>
请注意,如果我尝试创建在事务测试中没有唯一数据的新条目(不更新),那么测试按预期工作 - 如果未创建唯一实体,则抛出DataIntegrityViolationException。
有人可以澄清是否有可能使更新方案按预期工作,保持测试事务处理,这样我就不需要关心数据清理了吗?