gpt4 book ai didi

transactions - CDI交易管理

转载 作者:行者123 更新时间:2023-12-04 18:33:23 25 4
gpt4 key购买 nike

我正在进行从 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>

并使用@PersistenceContext注解将EntityManager注入(inject)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){
}
}

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 的答案

  1. CDI 不实现事务,但 JTA 规范可以。是的,JTA 定义了拦截器绑定(bind) @Transactional 并且实现必须提供匹配的拦截器。当您在 WildFly 下时,您的问题的答案在 JBoss JTA 实现中:Narayana。你会发现 @Transactional(Required) 拦截器here .其他人在同一个包中。
  2. 是的,你的理解是正确的。
  3. Extended Persistence context 只能在 EJB Stateful session bean 中注入(inject)。在 Java EE 7 中,您可以尝试使用新的 JPA 2.1 Unsyncrhonized mode (未在 CDI 中测试)。

关于transactions - CDI交易管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31252931/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com