Spring - No EntityManager with actual transaction available for current thread - cannot reliably process 'persist' call

前端 未结 15 1589
自闭症患者
自闭症患者 2020-11-30 20:08

I get this error when trying to invoke \"persist\" method to save entity model to database in my Spring MVC web application. Can\'t really find any post or page in internet

15条回答
  •  Happy的楠姐
    2020-11-30 20:11

    I had the same error when accessing an already transactional-annotated method from a non-transactional method within the same component:

    Before:
        @Component
        public class MarketObserver {
            @PersistenceContext(unitName = "maindb")
            private EntityManager em;
    
            @Transactional(value = "txMain", propagation = Propagation.REQUIRES_NEW)
            public void executeQuery() {
              em.persist(....);
            }
    
    
            @Async
            public void startObserving() {
              executeQuery(); //<-- Wrong
            }
        }
    
        //In another bean:
         marketObserver.startObserving();
    

    I fixed the error by calling the executeQuery() on the self-referenced component:

    Fixed version:
        @Component
        public class MarketObserver {
            @PersistenceContext(unitName = "maindb")
            private EntityManager em;
    
            @Autowired
            private GenericApplicationContext context;
    
            @Transactional(value = "txMain", propagation = Propagation.REQUIRES_NEW)
            public void executeQuery() {
              em.persist(....);
            }
    
    
            @Async
            public void startObserving() {
              context.getBean(MarketObserver.class).executeQuery(); //<-- Works
            }
        }
    

提交回复
热议问题