【发布时间】: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