Согласно javadoc FlushMode
(я предполагаю, что это вопрос JPA 1.0), и как указал @Konrad:
Если транзакция не активна, поставщик сохраняемости не должен сбрасываться в базу данных.
Поскольку вы, скорее всего, используете transaction-type="RESOURCE_LOCAL"
в качестве единицы измерения персистентности, поскольку я не вижу никаких begin
/ commit
, окружающих ваши звонки на EntityManager
(что не очень хорошо, подробнее об этом только после), для меня нет активной транзакции, поэтому я не ожидал, что что-то будет сброшено.
Во всяком случае, как напомнили в хороших JPA Concepts страница:
- С
<persistence-unit transaction-type="RESOURCE_LOCAL">
Вы несете ответственность за EntityManager
(PersistenceContext / Cache) создание
и отслеживание ...
- Вы должны использовать
EntityManagerFactory, чтобы получить
EntityManager
- Полученный
EntityManager
экземпляр является
PersistenceContext / Cache
-
EntityManagerFactory
можно вводить через
@PersistenceUnit
только аннотация (не @PersistenceContext)
- Вы
не разрешено использовать @PersistenceContext для ссылки на юнит
типа RESOURCE_LOCAL
- You
должен использовать API
EntityTransaction
, чтобы начать / зафиксировать каждый вызов вашего
EntityManger
- Calling
entityManagerFactory.createEntityManager()
дважды приводит к двум отдельным
Экземпляры EntityManager и для этого
два отдельных постоянных контекста / кэша.
- Это
почти никогда хорошая идея иметь более одного экземпляра
EntityManager используется (не создавайте
второй, если вы не уничтожили
первый)
Так что, на мой взгляд, вы должны исправить свой код здесь, нет никакого смысла задаваться вопросом о неожиданном поведении, если ваш код не верен. Просто выполняет звонки на ваш EntityManager
внутри транзакции.