У меня есть объект домена, который выглядит, как показано нижеJava Constraint Нарушения и Hibernate Validations не WOKING на обновление
@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;
}
хранилище зоны расширяет 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» на любое значение, кроме существующего идентификатора, то возникает нарушение ограничения. Это указывает на то, что исключение выбрасывается только для создания новых объектов, а не для обновления существующих.