Java 事务(readOnly=false)仅在从servlet调用时工作

Java 事务(readOnly=false)仅在从servlet调用时工作,java,spring,transactions,Java,Spring,Transactions,我试图创建一个bean,它通过JPA操纵数据库。这些方法都正确地用@Transactional(readOnly=false)进行了注释——到目前为止,这是由Servlet调用处理的,一切都很好 现在我想在init方法中执行一些数据库操作: @Component public class MyBean { @PostConstruct @Transactional(readOnly = false) public void init() { MyEnti

我试图创建一个bean,它通过JPA操纵数据库。这些方法都正确地用@Transactional(readOnly=false)进行了注释——到目前为止,这是由Servlet调用处理的,一切都很好

现在我想在init方法中执行一些数据库操作:

@Component
public class MyBean {

    @PostConstruct
    @Transactional(readOnly = false)
    public void init() {
        MyEntity myEntity = ...;
        ...
        em.persist(myEntity);
    }
(案件简化了)。像这样,我得到异常“没有会话或会话已关闭”。显然,只有在servlet中的请求运行时,事务才能正确启动,而不是从实际的bean运行。即使从bean本身运行,我如何实现这一点


谢谢。

AFAIK,Spring不会使用bean周围的事务代理来调用PostConstruct方法(顺便说一句,大多数时候这些方法不是bean外部接口的一部分)


尝试从另一个bean(MyBean被注入的地方)调用
MyBean的
init()
方法,或者甚至从
ServletContextListener
调用。好吧,Spring不会使用bean周围的事务代理来调用后构造方法(顺便说一句,大多数情况下,它们不是bean的外部接口的一部分)


尝试从另一个bean调用
MyBean
init(),甚至是从一个
ServletContextListener

中,最后我注入了applicationContext,获得了bean本身,并在从applicationContext传递的bean上运行了事务方法。谢谢你。最后我注入了applicationContext,获得了bean本身,并在从app传递的bean上运行了事务方法应用上下文。谢谢你的指导。