我在写完这个问题后意识到,我可以用几句话来概括。如何使用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或类似的东西管理我的交易?
感谢您的帮助。
答案 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的实现。 要考虑的关键点:
自定义(春季数据)Cdi配置->添加自定义事务后处理器custom spring data cdi configuration
实施自定义事务后处理程序: sample of a Custom Transactional Post Processor
为您的自定义Tx拦截器cdi producers
使用@Transactional(JTA)custom fragments
使用扩展范围 Repository 的Repository接口和带有@NoRepositoryBean注释custom repositories
看看此链接,其中有一些提示: tips
此致