2017-02-17 2 views
0

Problem: Wie Objekt gespeichert Konto als verschachteltes Objekt, wenn nur ID benötigt wird, ohne ConstraintValidator Ausnahme zu erhalten?Wie werden verschiedene Validierungsregeln für dieselbe Entität in Hibernate verwendet?

Problem ist, weil ich Validierungsregeln zu Klasse festgelegt habe, aber wenn ich sem-Objekt als geschachteltes Objekt speichern möchte, bekomme ich die Ausnahme, dass einige Eigenschaftswerte fehlen. Also würde ich mich freuen, verschiedene Validierungsregeln zu haben, wenn ich das Objekt als Ganzes persistieren möchte und wenn ich es nur als verschachteltes Objekt verwenden möchte (wenn nur die ID benötigt wird).

public class Account { 
    private int id; 

    @NotNull 
    private String name; 

    @NotNull 
    private String lastName; 

    @NotNull 
    private String userName; 
    //getters&setters 

Wenn ich Konto als verschachteltes Objekt umfassen i ID nur müssen in der Lage sein, um es als FK zu verwenden (Konto Einheit ist bereits in DB), sondern wegen der @NotNull Anmerkung i bekommen Ausnahme.

Gibt es eine Möglichkeit, diese Anmerkungen von Konto zu ignorieren, wenn Sie versuchen, Objekt Shop zu speichern oder verschiedene Validierungsregeln für Account zu erstellen, um nur andere Eigenschaften und nicht alle zu validieren?

public class Shop { 
    private int id; 

    private Account owner; // only ID is needed 

Haben Sie ein grundlegendes Beispiel? Ich verstehe das nicht in der Dokumentation. Ich habe die Dokumentation bereits gelesen, bevor ich hier poste.

Antwort

1

Sie möchten sich die Bean-Validierungsgruppen ansehen, in denen Sie bestimmte Validierungen klassifizieren können, so dass diese nur aktiviert werden, wenn diese Gruppe validiert und ignoriert wird.

Weitere Informationen finden Sie in der Dokumentation here.

ein Beispiel aus der Dokumentation Taking: basierend auf spezifischen Anwendungsfälle zur Laufzeit

// This is just a stub interface used for tagging validation criteria 
public interface DriverChecks { 
} 

// The model 
public class Driver { 
    @Min(value = 18, message = "You must be 18", groups = DriverChecks.class) 
    private int age; 
    // other stuffs 
} 

Eine Gruppe ist nichts anderes als ein Tag, die Sie/deaktivieren Validierungen aktivieren können. Wenn das Attribut groups in einer Bean-Validierungsannotation nicht angegeben wird, wird standardmäßig die Gruppe Default verwendet. Dies wird von Bean Validation verwendet, wenn zum Zeitpunkt der Validierung kein Gruppentag angegeben wurde.

, dass die folgenden Mittel gilt:

// Age won't be validated since we didn't specify DriverChecks.class 
validator.validate(driver); 

// Age will be validated here because we specify DriverChecks.class 
validator.validate(driver, DriverChecks.class); 

Dies funktioniert gut, wenn Sie das Auslösen der Validierung selbst in Ihrem Service-Methoden, weil Sie manuell anwendbar steuern können, welche Gruppe Kontrollen auf der Grundlage dieses Use Case-Methode.

Wenn es um die direkte Integration in die Ereignis-Listener von Hibernate ORM geht, die auch die Bean-Validierung auslösen können, werden die Gruppenspezifikationen etwas schwieriger, da sie basierend auf dem vom Hibernate ausgelösten Ereignistyp angegeben werden müssen.

javax.persistence.validation.group.pre-persist 
javax.persistence.validation.group.pre-update 
javax.persistence.validation.group.pre-remove 

Für jede der oben genannten Eigenschaften, die Sie in den JPA Eigenschaften geliefert Hibernate angeben können, können Sie eine durch Kommata getrennte Liste von Gruppen auflisten, die für jede dieser Ereignistypen validiert werden sollen. Auf diese Weise können Sie während des Einfügens verschiedene Überprüfungen durchführen, anstatt sie zu aktualisieren oder zu entfernen.

Wenn das nicht ausreicht, gibt es immer die Tatsache, dass Sie Ihre eigene Constraint-Validator-Implementierung und Annotation erstellen können, um sie in Bean Validation zu integrieren und auf Klassen- oder Eigenschaftsebene anzugeben.

Ich habe das oft in Fällen nützlich gefunden, in denen Werte aus mehreren Feldern als zusammenhängende Einheit validiert werden müssen, um ihre Gültigkeit zu implizieren, da die normalen Feld-zu-Feld-Validierungen nicht ausreichend waren.

+0

Haben Sie ein grundlegendes Beispiel? Ich verstehe das nicht in der Dokumentation. Ich habe die Dokumentation bereits gelesen, bevor ich hier poste. – AndroidTank

+0

Mehr Klarheit für Sie hinzugefügt. Ich habe mich nicht damit befasst, wie Sie Ihre eigenen benutzerdefinierten Constraint-Validatoren erstellen können, aber ich denke, dass die Dokumentation dafür klar ist. – Naros

Verwandte Themen