2009-07-06 6 views
2

Je cours le code suivant pour mettre à jour la base de données selon les données que j'ai lues du fichier CSV. J'ai essayé de déboguer, de vérifier la console et de parcourir les 800 enregistrements. Je ne reçois aucune erreur, mais seul le premier enregistrement est inséré. Si j'utilise persist au lieu de fusionner, j'ai l'erreur "Impossible de persister l'objet détaché".La fusion JPA ne semble pas fonctionner

 for (String[] data : dataList) { 
      log.debug("Reading data no " + (i++)); 
      EntityManager em = PersistenceUtil.getAgisDbEntityManager(); 
      EntityTransaction tr = em.getTransaction(); 
      tr.begin(); 

      try { 
       AddressEntity address = new AddressEntity(); 
       updateAddress(data, address); 
       em.merge(address); 
       //em.persist(address); 

       em.flush(); 
       tr.commit(); 
      } catch (Exception exc) { 
       log.error(exc.getMessage(), exc); 
       if (tr.isActive()) 
        tr.rollback(); 
      } 
     } 

Et voici ma méthode updateAddress, fondamentalement, c'est la mise à jour de certains champs.

private void updateAddress(String[] data, AddressEntity address) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { 
    //setting the column data 
    for (int i = 0; i < data.length; i++) { 
     final String column = dataColumns.get(i); 
     if (!column.equals("#IGNORE#")) { 
      setProperty(address, column, data[i]); 
     } 
    } 
    for (String field : this.defaultColumns.keySet()) { 
     if (!field.startsWith("#")) 
      setProperty(address, field, this.defaultColumns.get(field)); 
    }   
} 

Voici mon persistence.xml pour votre référence.

<persistence-unit name="agisdb-PU"> 
    <class>com.agis.livedb.domain.AddressEntity</class> 
    <properties> 
     <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/agisdb"/> 
     <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
     <property name="toplink.jdbc.user" value="root"/> 
     <property name="toplink.jdbc.password" value="password"/> 
    </properties> 
</persistence-unit> 

Pensez-vous que j'ai raté quelque chose? Merci beaucoup! Robert

Répondre

1

Ok, le problème est avec mon adresse objet entité, je dois ajouter ce qui suit au champ id. @GeneratedValue (strategy = GenerationType.identity)

Merci dfa! Robert

1
+0

persist me renvoie l'erreur "Impossible de persister l'objet détaché". –

+0

il fonctionne avec la fusion, mais il a enregistré uniquement le premier enregistrement .. aucune exception, mais le reste des enregistrements n'est pas enregistré ... –

+0

persist() sans flush() devrait fonctionner hors de la boîte – dfa

Questions connexes