2017-01-30 3 views
0

Ich verwende JPA und Hibernate, um eine Verbindung zu einer Tabelle herzustellen und Daten in die Tabelle einzufügen. Ich habe eine Tabelle sagen: Benutzer, der drei Spalten ID, Name und Adresse hat. Ich habe eine Entity-Klasse für das gleiche und um die Daten einzufügen benutze ich einfach das EntityManager-Objekt und behalte die Daten in der db, die für mich wie ein Zauber wirken.Überprüfen Sie vorhandene Werte in der Postgres-Tabelle, bevor Sie die Zeile einfügen

Jetzt habe ich ein Szenario, wo ich überprüfen möchte, ob die Werte, die ich persistiere, bereits existieren, wenn das der Fall ist, muss ich einen Fehler protokollieren. Derzeit lade ich die Zeilen manuell aus der Tabelle und überprüfe manuell, ob dieselben Werte existieren oder nicht, was ziemlich einfach für die Beispieltabelle (Benutzer) ist, die nur drei Spalten hat. Aber was, wenn ich einen Tisch mit 30 Spalten habe?

Kann ich die Daten manuell basierend auf einer Bedingung laden und nach anderen Spalten suchen oder gibt es einen besseren und einen kürzeren Weg dazu?

+2

eine Tabellenbedingung verwenden, um doppelte Zeilen nicht zulassen. – Kayaman

+0

+1 zu @Kayaman, Verwenden Sie die DB-Einschränkung. else sql/hql Abfrage ist die einzige Option. –

+0

Suchen Sie die eindeutige Untergruppe Ihrer Tabellen und wenden Sie für jede eine Einschränkung an. - Um bei Ihrem Beispiel zu bleiben, nehmen wir an, wir haben eine "Benutzer" -Tabelle mit einer Reihe von Spalten. Es ist höchst unwahrscheinlich, dass Sie zwei separate Zeilen zulassen möchten, in denen die Spalte "email" identisch ist, aber sagen wir, die "favourite_color" ist anders. – pozs

Antwort

0

30 Spalten, ist das der Primärschlüssel? Wenn es sich bei den Daten, die Sie auf Duplizierung prüfen, um den Primärschlüssel oder die eindeutige Einschränkung handelt, können Sie mithilfe von Hibnerate ein Objekt vor dem Speichern abrufen und es erneut melden, sofern es existiert. Wenn die 30 Spalten nicht Teil des Schlüssels sind, würde ich die Methode equals verwenden und alle Zeilen holen. Wenn es jedoch viele Zeilen sind, und dies würde langsam sein, dann würde ich wahrscheinlich einen dedizierten SQL zu überprüfen, schreiben, wo immer ein Objekt vorhanden ist, das heißt

UserDao public boolean rowExists(User user) { ... }

+0

Leider sind die 30 Spalten, die wir prüfen müssen, kein Teil des Schlüssels, das macht es schwierig. Bei Ihrer Lösung besteht das Problem darin, dass wir nicht alle 30 Spalten überprüfen müssen, sondern vielleicht 25 Spalten. –

+0

Dies ist eine sehr schlechte allgemeine Lösung. Wenn keine Tabellenbeschränkungen vorhanden sind, kann einfacher Multithread-Code Duplikate einfügen, sofern Sie nicht stark serialisierte Transaktionen verwenden. – Kayaman

+1

@AnkushBhan: Sie können immer einen eindeutigen Index für diese Spalten erstellen - aber 30 Spalten, die eindeutig sein sollten, klingt für mich wie eine seltsame Anforderung. –

Verwandte Themen