Spring @PostConstruct中没有会话休眠
MyDao类有通过Hibernate SessionFactory完成整个持久性任务的方法,它工作得很好 如上所示,我在MyService中注入了MyDao,但是在注入MyDao后调用@PostConstruct init()方法(调试时,我可以看到MyDao被很好地注入)时,会出现下一个Hibernate异常: org.hibernate.hibernateeexception:未找到当前线程的会话 我的服务实现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
@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
。这是一个构造函数还是一个从其他地方调用的方法?