EntityManager.setFlushMode () против Query.setFlushMode () - PullRequest
0 голосов
/ 09 мая 2018

Некоторые ссылки на документацию:

Перечисление javax.persistence.FlushModeType

  • AUTO: (по умолчанию) сбрасывание происходит при выполнении запроса.
  • COMMIT: при фиксации транзакции происходит сброс.

javax.persistence.EntityManager.setFlushMode (FlushModeType flushMode)

  • Установите режим очистки, который применяется ко всем объектам, содержащимся в контексте постоянства.

javax.persistence.Query.setFlushMode (FlushModeType flushMode)

  • Установите тип режима сброса, который будет использоваться для выполнения запроса. Тип режима очистки применяется к запросу независимо от типа режима очистки, используемого для диспетчера объектов.

Пример кода:

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();

Тест-кейсы: различные комбинации FlushModeTypes для entityManager и запроса. Также показывает журналы SQL:

  1. Тест-кейс: явный запрос с AUTO FlushModeType (query.setFlushMode (FlushModeType.AUTO); без комментариев):

    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.setFlushMode (FlushModeType.AUTO); прокомментированный):

    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
  • em flushModeType: COMMIT

Мои сомнения:

Я не понимаю, почему эти два теста выполняют запросы в разном порядке; когда flushModeTypes в обоих случаях одинаковы. Следствием этого является то, что в первом тестовом случае сохраняется «BBB», а во втором тестовом случае «AAA».

По моему мнению, оба тестовых примера должны выполнять запрос sql в одном и том же порядке, и правильный порядок должен быть таким же, как в 1-м тестовом случае (до: «AAA», после: «BBB»), потому что запрос has flushModeType = AUTO контекст сохранения должен быть сброшен в базу данных перед выполнением запроса.

Мой поставщик персистентности: EclipseLink.

БД: mariadb.

...