Чтобы быть прямым и к металлу, не будет javax.transaction.Synchronization
объектов, зарегистрированных для рассматриваемого EntityManager, пока вы на самом деле не используете это в транзакции.
Мы в app-server-land создадим один из этих объектов для выполнения flush()
и зарегистрируем его с помощью javax.transaction.TransactionSynchronizationRegistry
или javax.transaction.Transaction
.Это невозможно сделать, если нет активной транзакции.
Это длинный и короткий путь.
Да, сервер приложений вполне может хранить список ресурсов, которые он предоставилbean-компонент и автоматически регистрирует их в каждой транзакции, в которой bean-компонент с состоянием может запускаться или участвовать. Недостатком этого является то, что вы полностью теряете возможность решать, какие операции будут выполняться в каких транзакциях.Возможно, у вас есть 2 или 3 разных транзакции для выполнения в разных единицах постоянства, и вы агрегируете работу в расширенном контексте постоянства для очень конкретной транзакции.Это действительно проблема проектирования, и сервер приложений должен оставлять такие решения для самого приложения.
Вы используете его в транзакции, и мы зарегистрируем его в транзакции.Это базовый контракт.
Примечание, в зависимости от того, как обрабатывается базовый EntityManager, любой постоянный вызов EntityManager может быть достаточным для полного сброса наконец сделки.Конечно, flush()
является самым прямым и ясным, но persist()
или даже find()
может это сделать.