Spring Data JPA - 在CDI环境中使用@Transactional而不是Spring环境

时间:2013-05-10 22:47:15

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

我在写完这个问题后意识到,我可以用几句话来概括。如何使用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中,我只是不知道如何使其发挥作用。)

FYI用这个注释不起作用

@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或类似的东西管理我的交易?

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

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

看看此链接,其中有一些提示: tips

此致