gpt4 book ai didi

Java 约束违规和 HIbernate 验证在更新时不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 12:34:29 26 4
gpt4 key购买 nike

我有一个如下所示的域对象

@Entity
@Table(name = "zone")
public class Zone {

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
long id;

@Column(unique=true, nullable=false)
String uuid;

@NotNull
@Size(min=1)
@Column(unique=true, nullable=false)
String name;

@NotNull
@Size(min=1)
@Column(nullable=false)
String admin;
}

有两个服务调用可以保存和更新区域对象

@Override
public Zone create(Zone zone) {

if((zone.getUuid()==null)||(zone.getUuid().isEmpty())){
String uuid = UUID.randomUUID().toString();
zone.setUuid(uuid);
}
zoneRepository.save(zone);
return zone;
}

@Override
public Zone update(Zone zone) {
zoneRepository.save(zone);
return zone;
}

Zone存储库扩展了spring-data框架的JPA存储库

public interface ZoneRepository extends JpaRepository<Zone, Long>

我正在使用单元测试用例来测试这两个服务

@Test(expected=ConstraintViolationException.class)
public void createZoneWithBlankName(){
Zone zone = new Zone();
zone.setName("");
zone.setAdmin("Admin");
zoneService.create(zone);
}

当名称为空时,此测试用例按预期抛出 ConstraintViolationException。但是,当我使用空白名称更新已存在的区域时,不会抛出 ConstraintViolationException 并且下面的测试用例失败

@Test(expected=ConstraintViolationException.class)
public void updateZoneWithBlankName(){
Zone zone = new Zone();
zone.setName("Zone");
zone.setAdmin("Admin");
zoneService.create(zone);
Assert.assertTrue(zone.getId() != 0);

long id = zone.getId();
String newZoneName = "";
String newAdmin = "New Admin";

Zone zoneToUpdate = new Zone();
zoneToUpdate.setId(id);
zoneToUpdate.setName(newZoneName);
zoneToUpdate.setAdmin(newAdmin);

zoneService.create(zoneToUpdate);

}

如果我将“zoneToUpdate”对象的 id 设置为现有 id 以外的任何值,则会引发约束冲突。这表明仅在创建新对象时抛出异常,而在更新现有对象时不会抛出异常。

最佳答案

您没有看到更新异常的原因是当前工作单元没有刷新到底层数据库。

这是可以预料的:这就是一级缓存在 Hibernate 和 JPA 中的工作原理。

有关详细信息,请在 Spring Reference manual测试章节中搜索“误报”提示。 .

问候,

Sam(Spring TestContext 框架的作者)

关于Java 约束违规和 HIbernate 验证在更新时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37468663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com