2010-12-07 11 views
1

インポートするレコードがあります。初めて挿入されたときは大丈夫です。同じデータを再度インポートしようとすると、org.postgresql.util.PSQLExceptionが表示されます。エラー:重複キー値が一意制約に違反しています。データが同じ/または変更されている場合はデータベースのレコードを更新し、JDBCを使用して新しいデータを挿入する場合はどうすればできますか?JDBCを使用してテーブルを挿入または更新する

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(); 
} 

問題が修正されました。私は以下の答えを提供しました。

+0

XEntityとは何ですか? –

+1

あなたは実装のかなり初期段階にいるようです。永続性を扱う代わりに、JPAまたはHibernateの使用を検討しましたか?低レベルのJDBCアクセスが必要な特定の要件はありますか? –

+0

"this.updateEntity((XEntity)エンティティ)== 0"という理由を理解する必要があります。 – pinichi

答えて

0

このテストロジックが機能します。

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

問題は、レコードを更新する方法にありました。更新準備文のWHERE句は異なるデータ(空白を含むデータ)を使用していたため、updateEntityは常に0を返します。これが、更新の代わりに挿入のみが行われた理由です。ご助力ありがとうございます。

1

はあなたがJDBCを介して文字列としてUPDATEコマンドを渡すことができます 'MERGE' または 'REPLACE'

+0

私はこれをJDBCで行う必要があります。 – Seitaridis

+0

はい、JDBC経由でマージまたは置換クエリを実行するだけです(おそらくupdateEntityメソッドでですか?) – mauretto

0

PostgresのSQLを使用して試すことができます。

this投稿によると、2つのステートメントを書く必要があります。

+0

更新または挿入であることを検出する方法はありますか?または、私は更新しようとすることができ、それはレコードを挿入するcatch例外ブロックで失敗します。それは推奨されるアプローチですか? – Seitaridis

+0

私は自分の回答を変更しました。 – npinti

0

データの挿入と更新に同じ方法を使用する場合は、まずデータが存在するかどうかを確認する必要があります。新しいオブジェクトを挿入するために使用されるSQLコマンドはINSERTですが、要素の更新に使用されるコマンドはUPDATEです。したがって、あなたができることはSELECTでデータがすでに存在するかどうかを確認し、その結果に基づいてINSERTまたはUPDATEを実行することです。

ただし、これは回避策です。実際に実装を明確にし、データを追加するか更新するかにかかわらず、異なるメソッドを作成する必要があります。ビジネス側では、これらは明らかに2つの非常に異なる機能なので、両方のための1つの方法は私には設計上の問題があるように思えます。

関連する問題