2011-01-11 2 views
2

두 개의 엔티티, 트랜잭션 및 항목이 있습니다. 거래에는 자체 데이터와 차변 및 대변 금액으로 구성된 하나 이상의 항목 목록이 있습니다. 응용 프로그램의 한 부분에서 나는 이들 중 거의 모든 것을 제거해야하며이 경우 JPQL이 가장 쉽고 빠르다는 것을 알았습니다. 나는, EntityManager를 일부 트랜잭션에있는 모든 항목을 통과 할 필요는 동일한 트랜잭션에서 여전히 (실행 트랜잭션이 시간)JPA에서 데이터베이스 변경 사항을 인식하도록하십시오.

entityManager.createQuery(
       "DELETE FROM Entry e WHERE e IN (:entries)"). 
       setParameter("entries", new ArrayList<Entry>(
       entriesToRemove)).executeUpdate(); 
entityManager.createQuery(
       "DELETE FROM Transaction e WHERE e IN (:transactions)"). 
       setParameter("transactions", new ArrayList<Transaction>(
       transactions)).executeUpdate(); 

문제는 나중에 코드에서이다 :

이 코드를 실행 내가 최근에 제거한 거래를 여전히 제공합니다.

이 이벤트를 처리하는 방법이 있어야한다고 생각합니다. 여기 예제에서는 두 개의 JPQL 삭제 만 실행하지만 외부 서비스 나 외부의 다른 것을 호출하여 데이터베이스에 영향을 줄 수 있습니다. 어쨌든 EntityManager의 캐시가 여전히 유효하다는 것을 확인해야한다. 왜냐하면 삭제 된 객체를 여전히 포함하고 있기 때문이다.

나는 entityManager.flush()를 사용해 보았습니다. 이러한 삭제 후에는 성공하지 못합니다. 나는 executeUpdate()를 사용하기 때문에; 삭제가 바로 밑에있는 데이터베이스로 플러시되므로 정말 도움이되지 않을 것입니다.

모든 포인터, 힌트 및 답변을 이해하십시오. 모든 트랜잭션이 특정 계정에 속한다는 것을 알고있는 경우

답변

0

당신은, EntityManager 인터페이스

에서 clear() 방법을 사용하여 전체 캐시를 지우거나 할 수 있습니다, 당신은 Account 개체에 대한 EntityManager에서 refresh(Object entity)를 호출 할 수 있습니다.

0

이 문제는 나중에 코드에서이다, 여전히 같은 거래 (실행 트랜잭션이 시간) 내가 가 일부 트랜잭션에있는 모든 항목을 통과 할 필요는 에서 의 EntityManager는 여전히 나에게 을 제공합니다 방금 최근에 거래 한 가 삭제되었습니다.

플러시 모드

  • AUTO 기본 동작입니다. 거래 내에서 수행 한 모든 업데이트가 플러시되어 쿼리에서 이러한 변경 사항을 적용합니다.

  • COMMIT 변경 사항은 트랜잭션이 커밋 될 때만 플러시되고 모든 쿼리 이전에는 플러시되지 않음을 의미합니다. 당신이 FlushModeType.COMMIT를 사용하는 경우 거래에 반영됩니다 변경하면 같은 트랜잭션 내에서 두 개의 쿼리를 실행하는 경우에만 &를 저지로

아마, 다음 문제가 발생할 수 있습니다. FlushModeType.AUTO으로 잘 작동해야합니다. & 기본값이므로 명시 적으로 언급 할 필요가 없습니다.

여전히 문제가있는 경우 첫 번째 쿼리 후 트랜잭션을 커밋 할 수 있습니다.

0

우선 대량 삭제 명세서가 필요합니까? 즉, 원하지 않는 성능 임계 값을 초과 할 경우이를 교차하게됩니다. 필요하지 않으면 session.delete(e)을 사용할 수 있습니다.

그렇지 않은 경우 최대 절전 모드를 사용하는 경우 질문에 표시된 태그와 같이 session.evict(e)을 사용하여 세션에서 항목을 수동으로 제거 할 수 있습니다. here 코드를 사용하여 최대 절전 모드 세션을 시작할 수 있습니다.

희망이 있습니다.