2016-05-26 5 views
1

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

ответ

0

Причина, по которой вы не видите исключения для обновлений, заключается в том, что текущая единица работы не получает покраснел в базовую базу данных.

И этого можно ожидать: так работает кеш 1-го уровня в Hibernate и JPA.

Для получения более подробной информации найдите подсказку «ложные срабатывания» в Испытание глава Spring Reference manual.

С уважением,

Сэм (автор Spring Framework TestContext)