2009-07-06 4 views
2

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> 

내가 뭔가를 놓친 것 같니? 감사합니다. 로버트

답변

1

좋아, 문제가 내 주소 엔티티 객체이고, 나는 ID 필드에 다음을 추가해야합니다. @GeneratedValue (전략 = GenerationType.identity)

감사합니다. dfa! 로버트

1
+0

"내가 분리 된 개체를 유지할 수 없습니다."오류가 지속됩니다. –

+0

병합과 함께 작동하지만 첫 번째 레코드 만 저장했습니다 .. 예외는 없지만 나머지 레코드는 저장되지 않습니다 ... –

+0

flush()가없는 persist()는 out of the box에서 작동합니다 – dfa

관련 문제