【问题标题】:Spring Data JPA - Using @Transactional in a CDI environment instead of Spring environmentSpring Data JPA - 在 CDI 环境而不是 Spring 环境中使用 @Transactional
【发布时间】:2013-05-05 16:54:03
【问题描述】:

写完这个问题后,我意识到我可以用几句话来概括。如何使用 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 或类似的东西来管理我的交易?

感谢您的帮助。

【问题讨论】:

  • 据我所知,spring data 仍然希望您最终使用 spring bean;即使您正在使用 CDI。 CDI 集成只是提供一个生产者方法。

标签: jpa spring-data jpa-2.0 cdi spring-data-jpa


【解决方案1】:

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

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

问候,

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 2016-10-04
      • 2018-06-27
      • 1970-01-01
      • 2021-12-24
      相关资源
      最近更新 更多