Предположим, у меня есть бин Singleton
с EntityManager
в нем. Синглтон также указывает (на уровне метода или класса) атрибут транзакции REQUIRED
. Менеджер сущностей получается посредством инъекции @PersistenceContext
, которая указывает тип контекста постоянства TRANSACTION
. Для всех намерений и целей, если метод в этом синглтоне вызывается с существующей транзакцией, менеджер сущностей должен присоединиться к транзакции или, возможно, предоставить уже существующую, связанную с этой транзакцией через прокси. Если такой метод вызывается вне транзакции, новая транзакция будет запущена на время вызова метода.
Теперь предположим, что у нас есть второй компонент, который использует управляемые компонентом транзакции и внедряет синглтон. Если он явно запускает пользовательскую транзакцию, а затем вызывает метод в синглтоне, присоединится ли менеджер сущностей в этом методе к этой пользовательской транзакции? Будет ли работать переход от контекста, управляемого компонентом, к контексту транзакции, управляемому контейнером? Я знаю, что наоборот не создает барьер.
Класс синглтона:
@Singleton
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class PersistenceSingleton {
@PersistenceContext(unitName = "test", type = PersistenceContextType.TRANSACTION)
private EntityManager em;
public void doStuff() {
// perform actions with the entity manager that imply changes in the database
}
}
Компонент с пользовательскими транзакциями (может быть без сохранения состояния или с состоянием):
@Singleton
@TransactionManagement(TransactionManagementType.BEAN)
public class PersistenceFacade {
@EJB
private PeristenceSingleton ps;
@Resource
private UserTransaction userTx;
public void doStuff() {
userTx.begin();
ps.doStuff();
userTx.commit();
}
}
Учитывается ли транзакция, начатая в методе doStuff()
из PersistenceFacade
, при вызове doStuff()
в PersistenceSingleton
? Менеджер сущностей автоматически присоединяется к транзакции и ведет себя так, как ожидается от изоляции транзакции во время одновременного доступа?