Transactional(readOnly = false)仅在从Servlet调用时起作用

时间:2012-06-10 12:16:05

标签: java spring transactions

我正在尝试创建一个通过JPA操作数据库的bean。这些方法都使用@Transactional(readOnly = false)正确注释 - 直到现在,这是通过来自Servlet的调用来处理的,并且一切运行良好。

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

@Component
public class MyBean {

    @PostConstruct
    @Transactional(readOnly = false)
    public void init() {
        MyEntity myEntity = ...;
        ...
        em.persist(myEntity);
    }

(案例简化)。像这样我得到例外“没有会话或会话被关闭”。显然,只有在Servlet中的请求运行时才会正确启动事务,而不是从实际的bean运行。即使从bean本身运行,我怎样才能实现这一目标?

感谢。

1 个答案:

答案 0 :(得分:4)

AFAIK,Spring不会使用bean周围的事务代理来调用PostConstruct方法(BTW,大部分时间都不是bean的外部接口的一部分)。

尝试从另一个bean(注入MyBean)调用init() MyBean方法,甚至从ServletContextListener调用。