2013-10-23 2 views
0

테스트 케이스의 시작 부분에 테스트 데이터를 설정 한 JUnit 테스트가 있고 이후에 테스트 케이스의 조건을 테스트합니다 같은 테스트 방법으로. 테스트 사례의 조건을 테스트하는 쿼리는 네이티브 쿼리입니다. 나는 삽입/업데이트가 동일한 트랜잭션에 있기 때문에 DB에 즉시 쓰여 지도록 EntityManager.flush()를 명시 적으로 호출해야한다는 것을 알고 있습니다. 또한 entityManager.flush()를 JPA 쿼리로 대체 할 수 있다는 것을 알았습니다. JPA 쿼리는 동일한 결과를 얻은 것으로 보입니다. JPA는 SELECT 쿼리가 발행 될 때와 같이 즉시 JPA를 실행할 필요가있을 때까지 동일한 트랜잭션에서 DB 작업을 캐시 할 것이라고 들었습니다. 그래서이 모든 것이 합리적입니다. 내 질문은, 왜이 동작은 또한 네이티브 쿼리에 적용되지 않습니다 무엇입니까? 여기 내 기본 쿼리는 testSetup()에서 삽입/업데이트의 즉각적인 실행을 트리거하지 않으므로 내 어설 션이 실패하게됩니다.JPA : 기본 쿼리가 동일한 트랜잭션에서 캐시 된 삽입/업데이트의 실행을 트리거하지 않음

@Test 
@Transactional 
public void testCase() { 
    testSetup(); 
    entityManager.flush(); // can be replaced with entityManager.createQuery("from Person"); 

    List resultList = entityManager.createNativeQuery("select * from Person").getResultList(); 
    Assert.assertTrue(resultList.size() == 1); 
} 

답변

1

t1; dr - 네이티브 쿼리는 지속성 컨텍스트와 캐시를 우회합니다.

여기에는 분명히 createNativeQuery을 호출하여 생성 한 쿼리가 포함됩니다. 그러나 대량 업데이트 (UPDATEDELETE)는 JPQL에서 표현되었지만 공급자가 원시 쿼리로 변환하고 지속성 컨텍스트와 캐시도 무시합니다.

따라서 다른 쿼리를 플러시하거나 실행하면 예상되는 효과가 발생하지 않습니다.

또한 네이티브 쿼리가 현재의 지속성 컨텍스트에서 관리되거나 캐싱되는 엔티티의 데이터를 변경 한 경우 엔티티가 자동으로 새로 고쳐지지 않고 오래 보관됩니다.