2009-07-06 66 views
2

我運行以下代碼根據從CSV文件中讀取的數據更新數據庫。我試圖調試,並檢查控制檯,它正在運行整個800條記錄。我沒有收到任何錯誤,但只插入了第一條記錄。如果我使用持久而不是合併,我得到「無法堅持分離對象」錯誤。JPA合併似乎不起作用

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

這裏是我的updateAddress方法,基本上它更新了一些字段。

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

這裏是我的persistence.xml供大家參考。

<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> 

你覺得我錯過了什麼嗎? 非常感謝! 羅伯特

回答

1

好了,問題是我的地址實體對象,我必須添加以下id字段。 @GeneratedValue(strategy = GenerationType.identity)

Thanks dfa! Robert