Spring - 当前线程无可用的实际事务EntityManager,无法可靠地处理'persist'调用。
Spring - 当前线程无可用的实际事务EntityManager,无法可靠地处理'persist'调用。
在我的Spring MVC Web应用程序中,当尝试调用“persist”方法将实体模型保存到数据库时,我会遇到此错误。在互联网上找不到任何可以与此特定错误相关的帖子或页面。似乎EntityManagerFactory bean有问题,但我对Spring编程相当新,因此对我来说,一切都像在Web的各种教程文章中一样初始化良好。
dispatcher-servlet.xml
3 50 10 /WEB-INF/jsp/ .jsp
RegisterController.java
@Controller public class RegisterController { @PersistenceContext EntityManager entityManager; @Autowired PasswordValidator passwordValidator; @InitBinder private void initBinder(WebDataBinder binder) { binder.setValidator(passwordValidator); } @RequestMapping(value = "/addUser", method = RequestMethod.GET) public String register(Person person) { return "register"; } @RequestMapping(value = "/addUser", method = RequestMethod.POST) public String register(@ModelAttribute("person") @Valid @Validated Person person, BindingResult result) { if(result.hasErrors()) { return "register"; } else { entityManager.persist(person); return "index"; } }
admin 更改状态以发布 2023年5月23日
我遇到了同样的问题,我将方法注释为@Transactional
,然后问题解决了。
更新:查阅Spring文档,发现 PersistenceContext 默认是事务类型,所以该方法必须是事务型(http://docs.spring.io/spring/docs/current/spring-framework-reference/html/orm.html):
@PersistenceContext注解有一个可选的属性类型 type,默认为 PersistenceContextType.TRANSACTION。这个默认选项可用于接收共享实体管理器代理(proxy)。另一种选择是 PersistenceContextType.EXTENDED,这完全是另一个选择。这会导致所谓的扩展实体管理器,它不是线程安全的,因此不能用于正在被多个访问的组件,例如由Spring管理的单例Bean。扩展的实体管理器应该只用于具有状态的组件,例如常驻在Session中,在这种情况下,EntityManager的生命周期不会绑定到当前的事务,而完全由应用程序决定。