我正在尝试创建一个通过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本身运行,我怎样才能实现这一目标?
感谢。
答案 0 :(得分:4)
AFAIK,Spring不会使用bean周围的事务代理来调用PostConstruct方法(BTW,大部分时间都不是bean的外部接口的一部分)。
尝试从另一个bean(注入MyBean)调用init()
MyBean
方法,甚至从ServletContextListener
调用。