Atu*_*tul 3 transactions cdi jpa-2.1 wildfly-8
我正在从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_2_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>
Run Code Online (Sandbox Code Playgroud)
并使用@PersistenceContext注释将EntityManager注入DAO对象.
我们正在@Transaction为容器管理的事务使用注释.
我的问题/理解如下.
任何人都可以证实这一点,因为这对我来说是一个相对较新的领域.
1)据我所知,CDI通过@Transaction拦截器为CMT提供支持.哪个类/依赖实际上实现了这个拦截器?我们需要在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){
}
}
Run Code Online (Sandbox Code Playgroud)
3)考虑使用上述配置执行的以下简单场景:
Component1.somemethod() - 在事务内部运行并持久保存实体(例如:用户)并提交事务.在此之后,如下调用Component2:
Component2.somemethod()- 在转换内运行,但实体User似乎不处于托管状态, em.contains(user)返回false.我必须再次合并此实体,以便再次从持久存储中管理或重新加载
自Seam使用以来conversation-scoped entity manager,即使任何组件提交事务并且之后调用另一个组件,所有实体实例仍保持在托管状态(在持久化上下文中).但在CDI的情况下,据我所知,这是由于发生的"transaction scoped entity manager".事务提交后,所有实体实例都将分离.我们如何使用CDI实现与Seam相同的效果?
在使用Java EE 7/CDI 1.2时,回答您的问题并澄清以前只针对Java EE 6/CDI 1.0的答案
@Transactional并且实现必须提供匹配的拦截器.正如你在WildFly下,你的问题的答案是在JBoss JTA实现:Narayana.你会在这里找到@Transactional(Required)拦截器.其他人在同一个包中.Unsyncrhonized模式(未在CDI中测试).| 归档时间: |
|
| 查看次数: |
7806 次 |
| 最近记录: |