我運行以下代碼根據從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>
你覺得我錯過了什麼嗎? 非常感謝! 羅伯特
persist返回我「無法保持分離對象」錯誤。 – 2009-07-06 07:31:04