2010-12-07 4 views
1

Ich habe einige Datensätze zu importieren. Es ist in Ordnung, wenn sie zum ersten Mal eingefügt werden. Wenn ich versuche, dieselben Daten erneut zu importieren, erhalte ich eine org.postgresql.util.PSQLException: ERROR: doppelte Schlüsselwerte verletzen eindeutige Bedingungen. Wie kann ich die Datensätze in der Datenbank aktualisieren, wenn die Daten identisch sind oder geändert wurden, und die neuen Daten mit JDBC einfügen?Tabelle mit JDBC einfügen oder aktualisieren

public void store(Object entity) throws Exception { 
    try { 
     if (this.updateEntity((XEntity) entity) == 0) { 
      this.insertEntity((XEntity) entity); 
     } 

     ... 

    } catch (SQLException sqlEx) { 
     ... 
    } 
} 

private int updateEntity(XEntity entity) throws SQLException { 
    PreparedStatement prepStmt = this.getUpdatePreparedStmt(); 
    ... 
    return prepStmt.executeUpdate(); 
} 

private void insertEntity(XEntity entity) throws SQLException { 
    ... 
    this.getInsertPreparedStmt().executeUpdate(); 
} 

Das Problem ist jetzt behoben. Ich habe unten eine Antwort gegeben.

+0

Was ist XEntity? –

+1

Sie scheinen sich in den frühen Phasen Ihrer Implementierung zu befinden. Haben Sie darüber nachgedacht, JPA oder Hibernate anstelle von Persistenz zu verwenden? Gibt es bestimmte Anforderungen, die einen Low-Level-JDBC-Zugriff erfordern? –

+0

Sie sollten herausfinden, warum "this.updateEntity ((XEntity) entity) == 0". – pinichi

Antwort

0

Diese Testlogik funktioniert.

if (this.updateEntity((XEntity) entity) == 0) { 
    this.insertEntity((XEntity) entity); 
} 

Das Problem war in der Methode, die den Datensatz aktualisiert. Die WHERE-Klausel in der update-vorbereiteten Anweisung verwendete unterschiedliche Daten (Daten, die Leerzeichen enthalten), so dass updateEntity immer 0 zurückgab. Das war der Grund, warum nur Einfügungen anstelle von Aktualisierungen vorgenommen wurden. Vielen Dank für Ihre Hilfe.

1

können Sie versuchen, Postgres SQL 'MERGE' oder 'REPLACE'

+0

Ich muss dies in JDBC tun. – Seitaridis

+0

Ja, führen Sie einfach die Zusammenführung oder ersetzen Abfrage über JDBC (vielleicht in Ihrer updateEntity-Methode?) – mauretto

0

Sie können übergeben Sie den Befehl UPDATE als String über JDBC verwenden.

Nach this SO Post, müssen Sie 2 Anweisungen schreiben.

+0

Gibt es eine Möglichkeit zu erkennen, dass es ein Update oder einfügen ist. Oder kann ich versuchen, zu aktualisieren und es schlägt fehl, auf dem Catch-Ausnahme-Block einen Datensatz einzufügen. Ist es ein empfohlener Ansatz? – Seitaridis

+0

Ich habe meine Antwort geändert. – npinti

0

Wenn Sie dieselbe Methode zum Einfügen und Aktualisieren Ihrer Daten verwenden möchten, müssen Sie zuerst prüfen, ob die Daten vorhanden sind. Der SQL-Befehl, der zum Einfügen eines neuen Objekts verwendet wird, lautet INSERT, während zum Aktualisieren eines Elements UPDATE verwendet wird. Also, was Sie tun könnten, ist eine SELECT zu überprüfen, ob Ihre Daten bereits hier ist, und dann tun Sie eine INSERT oder UPDATE basierend auf den Ergebnissen.

Dies ist jedoch eine Problemumgehung. Sie müssten Ihre Implementierung wirklich klären und verschiedene Methoden wählen, unabhängig davon, ob Sie Daten hinzufügen oder aktualisieren. Business-Seite, das sind eindeutig zwei sehr unterschiedliche Funktionen, so scheint mir eine Methode für beide wie ein Design-Problem.