Я работаю над проектом миграции с JBoss Seam на CDI. Ниже приведен стек технологий:
1) WildFly 8.2.0 (CDI 1.2 с Weld в качестве поставщика CDI)
2) JSF 2.2
3) JPA 2
Мы используем JTA-транзакции, управляемые контейнером:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence@PersistenceContext
1.xsd">
<persistence-unit name="surveillenace" transaction-type="JTA">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<jta-data-source>java:/surveillenaceDS</jta-data-source>
<!-- other configurations not shown here -->
</persistence>
и используя аннотацию @PersistenceContext
для внедрения EntityManager в объект DAO.
Мы используем аннотацию @Transaction
для транзакций, управляемых контейнером.
Мои вопросы / понимание приведены ниже.
Кто-нибудь может подтвердить это, так как это относительно новая для меня область.
1) Насколько я понимаю, CDI обеспечивает поддержку CMT через перехватчик @Transaction. Какой класс / зависимость действительно реализует этот перехватчик? Какие артефакты нам нужно для этого импортировать в pom.xml?
2) Поскольку используется CMT, нам не нужно разграничивать транзакцию, и контейнер будет управлять ею. Нам нужно только использовать EntityManager API для сохранения изменений в Db. Это понимание правильное?
@Transactional
public String finishOperation() {
log.debug("in finishOperation() ") ;
try {
//operations done on managed entities
//no transaction demarcation code is required here
dao.getEntityManager.commit();
}catch(Throwable xx){
}
}
3) Рассмотрим нижеприведенный тривиальный сценарий, выполненный с использованием указанной выше конфигурации:
Component1.somemethod()
- выполняется внутри транзакции и сохраняет сущность (например, пользователя) и фиксирует транзакцию. После этого вызывается Component2, как показано ниже: Component2.somemethod()
- выполняется внутри преобразования, но объект User, похоже, не находится в управляемом состоянии, то есть em.contains(user)
возвращает false. Мне нужно снова объединить этот объект, чтобы он стал управляемым, или снова перезагрузить его из постоянного хранилища.
Поскольку Seam использует conversation-scoped entity manager
, все экземпляры сущностей остаются в управляемом состоянии (внутри постоянного контекста), даже когда какой-либо компонент фиксирует транзакцию и после этого вызывается другой компонент. Но в случае с CDI, насколько я понимаю, это происходит из-за "transaction scoped entity manager"
. После фиксации транзакции все экземпляры сущности отсоединяются. Как мы можем добиться того же эффекта, что и Seam, используя CDI?