Spring - 当前线程无可用的实际事务EntityManager,无法可靠地处理'persist'调用。

41 浏览
0 Comments

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日
0
0 Comments

当尝试在Spring数据仓库中使用deleteBy自定义方法时,我遇到了这个异常。此操作是从一个JUnit测试类中尝试进行的。

如果在JUnit类级别使用@Transactional注解,则不会发生异常。

0
0 Comments

我遇到了同样的问题,我将方法注释为@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的生命周期不会绑定到当前的事务,而完全由应用程序决定。

0