Spring @PostConstruct中没有会话休眠

Spring @PostConstruct中没有会话休眠,spring,hibernate,postconstruct,Spring,Hibernate,Postconstruct,MyDao类有通过Hibernate SessionFactory完成整个持久性任务的方法,它工作得很好 如上所示,我在MyService中注入了MyDao,但是在注入MyDao后调用@PostConstruct init()方法(调试时,我可以看到MyDao被很好地注入)时,会出现下一个Hibernate异常: org.hibernate.hibernateeexception:未找到当前线程的会话 我的服务实现 @Service("myService") @Transactional(rea

MyDao类有通过Hibernate SessionFactory完成整个持久性任务的方法,它工作得很好

如上所示,我在MyService中注入了MyDao,但是在注入MyDao后调用@PostConstruct init()方法(调试时,我可以看到MyDao被很好地注入)时,会出现下一个Hibernate异常:

org.hibernate.hibernateeexception:未找到当前线程的会话

我的服务实现

@Service("myService")
@Transactional(readOnly = true)
public class MyServiceImpl implements MyService {

    @Autowired
    private MyDao myDao;
    private CacheList cacheList;

    @PostConstruct
    public void init() {

        this.cacheList = new CacheList();
        this.cacheList.reloadCache(this.myDao.getAllFromServer());
    }

    ...
}
解决方法

正如上面向我推荐的@Yogi一样,我使用TransactionTemplate获得了一个有效/活动的事务会话,在这种情况下,我通过构造函数实现了它,对我来说效果很好

@Service("myService")
@Transactional(readOnly = true)
public class MyServiceImpl implements MyService {

    @Autowired
    private MyDao myDao;
    private CacheList cacheList;

    @Autowired
    public void MyServiceImpl(PlatformTransactionManager transactionManager) {

        this.cacheList = (CacheList) new TransactionTemplate(transactionManager).execute(new TransactionCallback(){

            @Override
            public Object doInTransaction(TransactionStatus transactionStatus) {

                CacheList cacheList = new CacheList();
                cacheList.reloadCache(MyServiceImpl.this.myDao.getAllFromServer());

                return cacheList;
            }

        });
    }

    ...
}

确保您正在事务下运行。我可以看到事务注释,但您似乎没有通过在spring上下文中使用
标记来激活使用注释的事务管理
MyServiceImpl
相关bean构造之后由Spring调用,并且
@Transaction
注释不用于管理会话生命周期。

一个解决方案可能是使用Spring AOP考虑使用缓存的方法而不是<代码> @ PrimeStudio< /Calp> < /P> < P>我不认为在<强> >代码> @构造> <代码> < /强>级别,所以<强> >代码> <代码> <强>不会有太大作用,除非<代码>模式<代码>被设置为<代码> AspectJ < /代码>


根据讨论,您可以使用在
init()
内启动手动事务来绑定
会话
,但如果您打算严格遵守声明性事务,则需要使用它来注册事件和用户以启动事务。

非常感谢,TransactionTemplate对我来说工作正常。;)您的代码有一个我不希望出现的“void”:
public void myservicecimpl
。这是一个构造函数还是一个从其他地方调用的方法?