2016-05-26 14 views
1

Ich habe ein Domain-Objekt, das wieJava Einschränkungsverletzungen und Hibernate Validierungen nicht woking auf Update

unten sieht
@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; 
} 

Es zwei Service-Anrufe, die die Zone zu speichern und aktualisieren

@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 Repositoryobjekte erweitert JPA Repository des Federdaten-Frameworks

public interface ZoneRepository extends JpaRepository<Zone, Long> 

Ich verwende Einheit Testfälle, die beiden Dienste zu testen

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

Dieser Testfall ConstraintViolationException wirft wie erwartet, wenn Name leer ist. Aber wenn ich mit einem leeren Namen eine bereits bestehende Zone an Aktualisierung wird keine ConstraintViolationException geworfen und der Testfall unter versagt

@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); 

} 

Wenn ich die ID von „zoneToUpdate“ Objekt auf einen anderen Wert als die vorhandenen ID gesetzt, Dann wird die Constraint-Verletzung ausgelöst. Dies bedeutet, dass die Ausnahme nur zum Erstellen neuer Objekte und nicht zum Aktualisieren der vorhandenen Objekte ausgelöst wird.

Antwort

0

Der Grund, warum Sie die Ausnahmen für Updates nicht sehen, ist, dass die aktuelle Arbeitseinheit nicht in die zugrunde liegende Datenbank gespült wird.

Und das ist zu erwarten: so funktioniert der First-Level-Cache in Hibernate und JPA.

Für Details, suchen Sie nach der "falsch positive" Spitze im Test Kapitel der Spring Reference manual.

Grüße,

Sam (Autor des Frühlings Testcontext Rahmen)

Verwandte Themen