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

前端 未结 15 1535
自闭症患者
自闭症患者 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条回答
  • 2020-11-30 20:24

    I had the same problem and I annotated the method as @Transactional and it worked.

    UPDATE: checking the spring documentation it looks like by default the PersistenceContext is of type Transaction, so that's why the method has to be transactional (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/orm.html):

    The @PersistenceContext annotation has an optional attribute type, which defaults to PersistenceContextType.TRANSACTION. This default is what you need to receive a shared EntityManager proxy. The alternative, PersistenceContextType.EXTENDED, is a completely different affair: This results in a so-called extended EntityManager, which is not thread-safe and hence must not be used in a concurrently accessed component such as a Spring-managed singleton bean. Extended EntityManagers are only supposed to be used in stateful components that, for example, reside in a session, with the lifecycle of the EntityManager not tied to a current transaction but rather being completely up to the application.

    0 讨论(0)
  • 2020-11-30 20:25

    I got this exception while attempting to use a deleteBy custom method in the spring data repository. The operation was attempted from a JUnit test class.

    The exception does not occur upon using the @Transactional annotation at the JUnit class level.

    0 讨论(0)
  • 2020-11-30 20:25

    If you have

    @Transactional // Spring Transactional
    class MyDao extends Dao {
    }
    

    and super-class

    class Dao {
        public void save(Entity entity) { getEntityManager().merge(entity); }
    }
    

    and you call

    @Autowired MyDao myDao;
    myDao.save(entity);
    

    you won't get a Spring TransactionInterceptor (that gives you a transaction).

    This is what you need to do:

    @Transactional 
    class MyDao extends Dao {
        public void save(Entity entity) { super.save(entity); }
    }
    

    Unbelievable but true.

    0 讨论(0)
  • 2020-11-30 20:30

    I had this issue for days and nothing I found anywhere online helped me, I'm posting my answer here in case it helps anyone else.

    In my case, I was working on a microservice being called through remoting, and my @Transactional annotation at the service level was not being picked up by the remote proxy.

    Adding a delegate class between the service and dao layers and marking the delegate method as transactional fixed this for me.

    0 讨论(0)
  • 2020-11-30 20:30

    This helped us, maybe it can help others in the future. @Transaction was not working for us, but this did:

    @ConditionalOnMissingClass("org.springframework.orm.jpa.JpaTransactionManager")

    0 讨论(0)
  • 2020-11-30 20:32

    I had the same error code when I used @Transaction on a wrong method/actionlevel.

    methodWithANumberOfDatabaseActions() { 
       methodA( ...)
       methodA( ...)
    }
    
    @Transactional
    void methodA( ...) {
      ... ERROR message
    }
    

    I had to place the @Transactional just above the method methodWithANumberOfDatabaseActions(), of course.

    That solved the error message in my case.

    0 讨论(0)
提交回复
热议问题