0

写完这个问题后,我意识到我可以用几句话来概括。如何使用 CDI 管理 Spring-Data-JPA 中的事务,就像在 Spring 本身中使用 @Transactional 一样?

我做的第一件事是根据此处的文档设置 Spring Data JPA CDI。http://static.springsource.org/spring-data/data-jpa/docs/current/reference/html/jpa.repositories.html#jpd.misc.cdi-integration

我设置了它,它可以正常用于读取操作但不能用于写入操作

例如,他们在文档中的示例可以正常工作。

List<Person> people = repository.findAll();

所以我已经完成了基本设置。

手写可能有错别字。这类似于我执行的代码。

@Inject
UserRepository userRepository;

User user;

@Transactional
public void signUpUserAction() {
  userRepository.saveAndFlush(user);
}

然后我收到这个错误

Caused by: javax.persistence.TransactionRequiredException: no transaction is in progress

起初我意识到我没有@Transactional,所以我添加了它但仍然没有工作。(我相信在春天你需要使用AOP xml文件来设置@Transactional,所以这在EE中不起作用是有道理的盒子,我只是不知道如何使它工作。)

仅供参考,用这个注释不起作用

@TransactionAttribute(TransactionAttributeType.REQUIRED)

我在写这篇文章时尝试了一些东西,我让它工作了......但我不喜欢代码并且仍然对使用 @Transactinoal 感兴趣,这段代码感觉很脏,我很确定 @Transactional 处理以干净的方式调用其他事务性方法,而此代码不会。

这保存,我验证它在数据库中。

@Inject
EntityManager em;

@Inject
UserRepository userRepository;

private User user;

public void signUpUserAction() {
  em.getTransaction().begin();
  userRepository.saveAndFlush(user);
  em.getTransaction().commit();
}

简而言之,我如何使用 @Transactional 或类似的东西来管理我的交易?

感谢您的任何帮助。

4

2 回答 2

2

如果您在 CDI 环境中运行 Spring Data,那么您根本就没有运行 Spring 容器。因此,您需要使用 EJB 会话 bean 来处理存储库,因为 CDI 目前不支持开箱即用的事务。Spring Data 附带的 CDI 扩展基本上提供了进入 JavaEE 世界的入口点,您将使用可以在该环境中使用的标准事务机制。

因此,您要么直接将存储库注入@Statelessbean,要么将 CDI bean 注入其中。这将允许您在 EJB 上使用 EJB 事务注释。

于 2013-05-12T19:07:32.030 回答
0

对于所有有这个问题的人。我有这个在 CDI 环境中支持 @Transactional 的实验项目。该项目使用 Narayana 的自定义代码作为拦截器,并提供与其和 Spring Data Jpa 实现的兼容性。需要考虑的关键点:

看看这个有一些提示的链接: tips

问候,

于 2019-08-13T22:00:52.210 回答