>

3.6에서 실행 된 오래된 프로젝트가 있습니다. 방금 최대 절전 모드 5로 업데이트했으며 더 이상 실행되지 않는 몇 가지 테스트가 있습니다.

정확한 사례 :

@Test
public void testConflictingKeyword() {
    Location loc = locationDao.findByKeyword("l1");
    try {
        loc.setKeyword("l2");
        locationDao.update(loc);
        fail("should not be able to update entity, another entity with keyword exists");
    } catch (Exception e) {}
}

이 테스트는 3.6에서 정상적으로 실행됩니다. dao 업데이트가 호출되었으며 constrantviolationexception이 있음을 알 수 있습니다.

그러나 5로 업그레이드 한 후에는 업데이트 방법이 더 이상 호출되지 않습니다.

그러나 다른 locationDao.findByKeyword("l1") 를 추가하면  업데이트 후 메소드 호출 후 업데이트 SQL이 실행됩니다!

자동 커밋 및 플러싱과 관련이 있다고 생각하지만 3.6에서와 같이 5를 어디에서보고 동작하는지 확실하지 않습니다 ...

누군가가 공유 할 단서가 있다면 감사 할 것입니다.

  • 답변 # 1

    다시 한번 : 이것은 플러시 모드에 문제가 있습니다.

    기본적으로 최대 절전 모드는 자동 플러시 모드를 사용하는데, 이는 시스템이 때때로 플러시를 호출하여 오래된 상태가 반환되지 않도록 알려줍니다.

    3.6에있는 동안 업데이트 호출 중에는 세션이 자동으로 플러시되었습니다. (사용자가 업데이트를 호출하는 경우 수정되지 않은 상태를 저장하는 이유 :이를 수행하고 기본적으로 AUTO 모드를 준수하십시오).

    지금 5는 응용 프로그램 성능을 향상시키고 데이터베이스 서버 상호 작용 횟수를 줄이기 위해 노력하고 있습니다. 따라서 각 업데이트/작성 호출 중에 플러시되지 않습니다. 그러나 특정 유형의 객체에 대한 쿼리를 실행하려고하면 세션 상태를 확인하고 쿼리 된 유형의 객체가 수정 된 것을 확인하여 정확한 SELECT 전에 플러시를 수행합니다.

    이 문제를 해결하기 위해 : 전화가 필요할 때 수동으로 플러시합니다. 내가 알 수 있듯이 언급 한 테스트에서 데이터베이스 고유 검사에 의존하고 있으며 플러시 중에 만 확인이 수행됩니다. 이것이 가장 쉬운 수정 방법입니다. 또 다른 방법은 순수한 데이터베이스에 대한 고유 한 검사를 서비스 기반으로 추출하는 것입니다 ...

    또는 단순히 FlushMode.ALWAYS를 사용하도록 최대 절전 모드 구성을 변경하십시오.

  • 답변 # 2

    Hibernate 5.2에서 AUTO Flushmode의 동작을 변경 한 것 같습니다. 짧은 시간에 비공개 블로그 만 찾을 수있었습니다.

    와이즈 비즈

    건배, 라이너

    Since Hibernate 5.2, if you bootstrap Hibernate using JPA (e.g. persistence.xml), then even the Hibernate FlushType.AUTO will behave just like its JPA counterpart. Only if you bootstrap Hibernate using the native mechanism, will the Hibernate Session use the legacy FlushType.AUTO behavior.

관련 자료

  • 이전 Logging Soap Request and Response - 비누 요청 및 응답 로깅 - 봄
  • 다음 powershell - cmdexe 이탈 반환