CSV 파일에서 읽은 데이터에 따라 데이터베이스를 업데이트하려면 다음 코드를 실행하고 있습니다. 디버깅을 시도하고 콘솔을 확인하고 전체 800 개의 레코드를 실행 중입니다. 나는 어떤 오류도 내지 않지만 첫 번째 레코드 만 삽입됩니다. 병합 대신 지속성을 사용하는 경우 "분리 된 개체를 유지할 수 없습니다."오류가 발생합니다.JPA merge가 작동하지 않는 것 같습니다.
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>
내가 뭔가를 놓친 것 같니? 감사합니다. 로버트
"내가 분리 된 개체를 유지할 수 없습니다."오류가 지속됩니다. –
병합과 함께 작동하지만 첫 번째 레코드 만 저장했습니다 .. 예외는 없지만 나머지 레코드는 저장되지 않습니다 ... –
flush()가없는 persist()는 out of the box에서 작동합니다 – dfa