Некоторые ссылки на документацию:
Перечисление 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:
Тест-кейс: явный запрос с 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
Тестовый случай: неявный (значение по умолчанию) запрос с 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.