2013-07-13 2 views
8

나는 Spring MVC에 익숙하지 않으며 JPA 와도 잘 맞지 않는다. 필자가 원하는 것은 레코드 목록을 업데이트하고 목록을 반복하고 DAO에서 update를 호출 할 때 잘 작동하는 것입니다.JPA Spring MVC에서 JPA Hibernate 일괄/일괄 업데이트

하지만 100 건의 업데이트/삽입 작업이나 DB 왕복 여행을 원합니다.

어느 한 방법 대신 다음을 수행 일괄 업데이트의 약 100 레코드를 업데이트하는 나를 보여 주 시겠어요 :
Controller: 
    List<MyEntity> list = form.getList(); 
    for(MyEntity e : list){ 
     dao.update(e); 
    } 

Dao: 
    public T update(T entity){ 
     entityManager.merge(entity);   
    } 

그것이 가능, 누군가가 나에게 일괄 업데이트를 수행 할 수있는 간단한 방법을 제공 할 수 있다면. 나는 가능한 한 많은 설명을하면 정말로 감사 할 것입니다.

감사합니다.

답변

5

JPA를 통해 여러 행을 업데이트하는 표준 방법입니다. spring-data-jpa이 표시되면 save(Iterable<T> items)은 덮개 아래의 Iterator 위로 반복됩니다. here의 또 다른 질문은 옵션에 대해 매우 잘 대답하지만 간단히 말하자면 직접 업데이트 진술을 공식화하고 실행하는 대안이 있습니다.

업데이트 : 단일 트랜잭션으로 실행하면 트랜잭션 오버 헤드가 한 번만 발생하기 때문에 성능이 향상 될 수 있습니다. 업데이트 중 하나라도 실패하면 이전의 업데이트도 롤백되는 시나리오를 얻을 수 있습니다. (따라서 잠재적으로 이전 업데이트의 모든 작업을 잃게됩니다 - 당신이 원할 수도 있고 아닐 수도 있습니다)

또한 사용중인 트랜잭션 관리자 유형 (예 : JTA 또는 JPA)과 JPA 구현 (예 : 최대 절전 모드) 때로는 같이 재생되지 않습니다.

그래서 DAO 코드에서이 작업을 수행 할 수 있습니다.

  • 그 코드에 과부하 update(Iterator<Entity> entities) 코드
  • 를 추가하려면 다음과 같은 일을 할;

    entityManager.getTransaction().commit();//complete the transaction

  • }

    entityManager.merge(entity);//update an entity 
    

    for (Entity entity : entities) {

    entityManager.getTransaction().begin();//start the transaction

    은 또는 당신은 당신은 당신의 save(Iterable<Entity> entities) 방법에 @Transactional 주석을 사용할 수 있습니다. Spring 컨텍스트에서 트랜잭션 어노테이션을 지원하는지 확인하십시오
+0

트랜잭션에서 루프를 수행하고 끝 호출을 커밋 할 경우 어떻게됩니까? 그것이 어떤 차이를 만들지. 그냥 – user22197

+0

설명해 주실 수 있습니까? 아니면 스프링 배치를 사용하는 것이 좋습니다. – user22197

+0

을 사용하여 Spring-Batch 파트에 응답하려면 호출자에게 동기식 응답을 수행해야합니까? –