【发布时间】:2014-03-05 09:27:37
【问题描述】:
MyDao 类具有通过 Hibernate SessionFactory 完成整个持久性任务的方法,它工作正常。
如上所示,我在 MyService 中注入了 MyDao,但是在注入 MyDao 后调用 @PostConstruct init() 方法时(调试我可以看到 MyDao 注入良好)得到下一个 Hibernate 异常:
org.hibernate.HibernateException: No Session found for current thread
我的服务实现。
@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;
}
});
}
...
}
【问题讨论】:
-
您的代码有一个“空白”,我不希望有一个:
public void MyServiceImpl。这应该是构造函数还是您从其他地方调用的方法?
标签: spring hibernate postconstruct