2010-12-07 3 views
1

J'ai quelques enregistrements à importer. C'est bon la première fois quand ils sont insérés. Si j'essaie d'importer à nouveau les mêmes données, je reçois un org.postgresql.util.PSQLException: ERROR: la valeur de la clé en double viole la contrainte unique. Comment puis-je mettre à jour les enregistrements dans la base de données si les données sont identiques/ou modifiées et insérer si c'est de nouvelles données en utilisant JDBC?Insérer ou mettre à jour une table à l'aide de 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(); 
} 

Le problème est maintenant résolu. J'ai fourni une réponse ci-dessous.

+0

Qu'est-ce que XEntity? –

+1

Vous semblez être dans les premières étapes de votre implémentation. Avez-vous envisagé d'utiliser JPA ou Hibernate à la place pour gérer la persistance? Existe-t-il des exigences particulières qui nécessitent un accès JDBC de bas niveau? –

+0

Vous devriez comprendre pourquoi "this.updateEntity ((XEntity) entity) == 0". – pinichi

Répondre

0

Cette logique de test fonctionne.

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

Le problème résidait dans la méthode qui mettait à jour l'enregistrement. La clause WHERE de l'instruction préparée update utilisait des données différentes (données contenant des espaces) afin que updateEntity renvoie toujours 0. C'est la raison pour laquelle seules les insertions ont été effectuées, au lieu des mises à jour. Merci beaucoup pour votre aide.

1

Vous pouvez essayer d'utiliser postgres SQL « MERGE » ou « REMPLACER »

+0

Je dois le faire dans JDBC. – Seitaridis

+0

Oui, exécutez simplement la fusion ou remplacez la requête via JDBC (peut-être dans votre méthode updateEntity?) – mauretto

0

Vous pouvez passer la commande UPDATE comme une chaîne via JDBC. Selon le code this, vous devrez écrire 2 instructions.

+0

Y at-il un moyen de détecter qu'il s'agit d'une mise à jour ou d'une insertion? Ou puis-je essayer de mettre à jour et il échoue sur le bloc d'exception de capture insérer un enregistrement. Est-ce une approche recommandée? – Seitaridis

+0

J'ai modifié ma réponse. – npinti

0

Si vous souhaitez utiliser la même méthode pour insérer et mettre à jour vos données, vous devez d'abord vérifier si les données existent. La commande SQL utilisée pour insérer un nouvel objet est INSERT, tandis que celle utilisée pour mettre à jour un élément est UPDATE. Donc, ce que vous pouvez faire est de faire un SELECT pour vérifier si vos données sont déjà là, puis faites un INSERT ou UPDATE en fonction des résultats.

Cependant, il s'agit d'une solution de contournement. Vous devez vraiment clarifier votre implémentation et créer des méthodes différentes, que vous ajoutiez ou que vous mettiez à jour des données. Du côté des entreprises, il s'agit clairement de deux fonctions très différentes, donc une méthode pour les deux me semble être un problème de conception.

Questions connexes