Spring ApplicationPistener中的hibernate会话错误

时间:2018-02-22 10:06:06

标签: java spring hibernate

我无法猜出我的配置有什么问题。我需要在ApplicationListener中使用hibernate方法,但不断收到此错误:

Could not obtain transaction-synchronized Session for current thread

尽管在方法下使用了@Transactional。这是ApplicationListener实现:

@Component
public class FillIdOnStartup implements ApplicationListener<ContextRefreshedEvent>
{
    @Inject
    private MyRepository repository;


    @Override
    public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent)
    {
        Iterable<Provider> products = repository.findAll();
    }
}

这就是findAll()方法的样子:

@Override
    @SuppressWarnings("unchecked")
    @Transactional(readOnly = true)
    public Iterable<T> findAll()
    {
        return session().createQuery("from " + entityClass.getName()).getResultList();
    }

有什么问题?谢谢

1 个答案:

答案 0 :(得分:0)

我找到了答案。问题是像ApplicationListener,@ PostConstruct注释这样的东西在@Transactional之前被初始化。这就是hibernate无法获得当前会话的原因。解决方案是直接在metod中打开会话并开始事务:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
// some hibernate actions.
tx.commit();
session.close();