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