IT

엔티티 관리자.setFlushMode() vs Query.setFlushMode()

itgroup 2023. 8. 31. 23:49
반응형

엔티티 관리자.setFlushMode() vs Query.setFlushMode()

일부 설명서 참조:

javax.persistence를 열거합니다.플러시 모드 유형

  • AUTO: (기본값) 쿼리 실행 시 플러시합니다.
  • 커밋: 트랜잭션 커밋 시 플러시가 발생합니다.

자백스 독립엔티티 관리자.플래시 모드 설정(플래시 모드 유형 플래시 모드)

  • 지속성 컨텍스트에 포함된 모든 개체에 적용되는 플러시 모드를 설정합니다.

자백스 독립Query.setFlushMode(FlushModeTypeflushMode)

  • 쿼리 실행에 사용할 플러시 모드 유형을 설정합니다.플러시 모드 유형은 엔티티 관리자에 사용 중인 플러시 모드 유형에 관계없이 쿼리에 적용됩니다.

샘플 코드:

PTEmp e = em.find(PTEmp.class, 7852L);
e.setName("AAA");

String updateSqlString = "UPDATE PTEmp SET name = :name WHERE id = :id";
TypedQuery<PTEmp> query = em.createQuery(updateSqlString, PTEmp.class);
query.setParameter("name", "BBB");
query.setParameter("id", 7852L);

query.setFlushMode(FlushModeType.AUTO); // <= in 2nd test-case 
                                        //    this line is commented
em.setFlushMode(FlushModeType.COMMIT);

System.out.println("query FMT: " + query.getFlushMode()); // Always print: AUTO
System.out.println("em    FMT: " + em.getFlushMode());    // Always print: COMMIT

em.getTransaction().begin();
query.executeUpdate();
em.getTransaction().commit();

테스트 사례: entityManager 및 쿼리에 대한 FlushModeTypes의 서로 다른 조합.SQL 로그도 표시합니다.

  1. 테스트 사례: AUTO FlushModeType(query.setFlushModeType)을 사용하여 명시적으로 쿼리합니다.자동); 주석 없음):

    1594 Query     UPDATE PTEMP SET fullname = 'AAA' WHERE (ID = 7852)
    1594 Query     UPDATE PTEMP SET fullname = 'BBB' WHERE (ID = 7852)
    1594 Query     COMMIT
    
  2. 테스트 사례: AUTO FlushModeType(query.setFlushModeType(FlushModeType)을 사용한 암시적(기본값) 쿼리.자동); 주석 있음):

    1616 Query     UPDATE PTEMP SET fullname = 'BBB' WHERE (ID = 7852)
    1616 Query     UPDATE PTEMP SET fullname = 'AAA' WHERE (ID = 7852)
    1616 Query     COMMIT
    

두 테스트 사례 모두에서 System.out.println()은 다음을 반환합니다.

  • 쿼리flushModeType: AUTO
  • emflushModeType: COMMIT

내 의심은:

두 테스트 사례 모두 flushModeTypes가 동일한데 왜 이 두 테스트 사례가 서로 다른 순서로 쿼리를 실행하는지 이해할 수 없습니다.그 결과, 마지막으로 첫 번째 테스트 사례는 'BBB'이고 두 번째 테스트 사례는 'AAA'를 유지합니다.

쿼리에 flushModeType=이 있기 때문에 두 테스트 사례 모두 동일한 순서로 SQL 쿼리를 실행해야 하며 올바른 순서는 첫 번째 테스트 사례(이전: 'AAA', 이후: 'BBB')와 같아야 합니다.AUTO 쿼리를 실행하기 전에 지속성 컨텍스트를 DB로 플러시해야 합니다.

내 지속성 제공자:이클립스 링크.

DB: mariadb.

언급URL : https://stackoverflow.com/questions/50257768/entitymanager-setflushmode-vs-query-setflushmode

반응형