Hallo,
habe eine mittelgroße Anwendung und bin mir im Unklaren wie ich etwas handeln soll.
Habe eine DB auf die ich per JDBC zugreife.
Habe einen ServiceLayer, der das JDBC handelt.
Habe eine GUI in der ich Eingaben einlese und an diesen ServiceLayer weitergebe. Rückgabe ist dann ein Java Bean, bzw. POJO.
Multiple Client Architektur mit lediglich der Datenbank als Server/Integrationsschicht.
Nun möchte ich Daten in die Datenbank einfügen. Datensatz besteht aus ID long (PK), Name String. Der Name soll unique sein.
Service Layer liefert mir dann ein JavaBean mit den Daten zurück.
An welcher Stelle mache ich die Validierung, hauptsächlich wegen UNIQUE am geschicktesten?
-
GUI macht Request ob Name bereits vergeben ist. Also zusätzliche Methode im ServiceLayer und verbietet dann das Speichern.
-
ServiceLayer macht zusätzlichen Request und prüft ob Unique.
2a. Daraufhin Exception werfen.
2b. Daraufhin null zurückgeben.
2c. Daraufhin das bereits vorhandene Objekt zurückgeben. -
ServiceLayer macht insert,
3a. Exception wird gefangen und ausgewertet.
3b. Exception wird weitergeworfen. -
StoredProcedures
StoredProcedure checkt auf unique, speichert und oder liefert dann die Werte von neuem bzw. bereits vorhandenem Objekt zurück.
GUI schaut ob dieses Objekt vorhanden ist.
4 macht am meisten Sinn, möchte allerdings so wenig StoredProcedures wie möglich haben.
1 + 2 Zusätzliche Request bergen immer das Risiko von Concurrency-Problemen, sowie zusätzlichen Abfragen. Wenn ich nun noch Locking einsetzen muss, dann dreh ich noch komplett hohl.
3a. Aufwendig und wenn eine DB ihre Fehlermeldungen noch internationalisiert, nicht handhabbar.
3b. Sehr, sehr unschön, eigentlich ein NOGO.
Frage mich nicht warum kein ORM zum Einsatz kommt. Das ist Teufelszeug und nicht meine Entscheidung.
Wo ist mein Denkfehler? Was meint ihr?
Besten Dank und einen schönen Mittag