2016-04-12 16 views
0

Ich möchte in der Lage sein, im Detail die Details eines Schemas inspizieren alle meine Entitäten gebunden sind, und ziehen Sie diese auf die Anwendungsebene für die Validierung, damit ich Übermitteln Sie keine Daten (und verschwenden so Ressourcen) an eine db, die letztendlich abgelehnt wird.Anwendungsebene db Constraint Weiterleitung: Wie mit JDBC und Spring automatisch

Zum Beispiel:

CREATE TABLE Foo(
    ID BIGINT PRIMARY KEY, 
    Baz varchar(5) NOT NULL 
); 

@Entity 
public class Foo { 
    @Id 
    public Long id; 

    public String baz; 

} 


@Repository 
public interface FooRepository extends PagingAndSortingRepository<Foo, Long> {} 

Foo f = new Foo(); 
f.id = 1; 
f.baz = "123456"; 

@Autowired 
FooRespository fooRepo; 
fooRepo.save(f); // fails BEFORE going to DB with constrain violation. 

Ich kann mich deutlich sehen, kann dies selbst umzusetzen, aber ich bin irgendwo da draußen in der großen Welt der Annahme ist eine Bean/Validator, dass dieser Job für mich tun wird.

Antwort

0

Ich würde ein Design vermeiden, das die Regeln Ihres Schemas dupliziert. Ihr Programm müsste die Datenbank jedes Mal, wenn es zu bestätigen beginnt, dass es die Einschränkungen kennt, effektiv zurückentwickeln. Wenn Sie ein Cluster- oder ein verteiltes System haben, fügt ein anderes Programm außerdem möglicherweise eine Zeile ein, die eine Integritätsverletzung verursacht, und Ihr Programm muss diesen Fehler weiterhin behandeln.

Ich würde Sie ermutigen, entweder (a) sich nicht um etwas zu kümmern, das nicht sehr häufig passieren sollte oder (b) Ihr Design zu überdenken, wenn Sie absichtlich das Schema oft brechen.

Das Paket javax.validation.constraints existiert und kann Ihnen helfen, im Voraus zu überprüfen, ob ein Objekt gut aussieht. Sie werden jedoch beispielsweise die @NotNull-Annotation von javax.validation.constraints und Ihr Datenbankschema duplizieren. Platzieren Sie die Geschäftsregeln an einem Ort, um den Wartungsaufwand zu minimieren.

+0

Ich benutze javax.validation bereits. Wenn ich Geschäftsregeln in die DB (an einer Stelle) setze, werde ich lediglich die Regel weiterleiten (nicht duplizieren). Duplizieren würde @NotNull für das Entitätsfeld und NOT NULL für die Spalte haben. Wenn die Einschränkung in der DB gelöscht wird, könnte die Anwendung übermäßig restriktiv sein. –