Dan*_*ani 3 spring hibernate postconstruct
MyDao 类具有通过 Hibernate SessionFactory 执行整个持久性任务的方法,它工作得很好。
我在 MyService 中注入了 MyDao,如上所示,但是当注入 MyDao 后调用 @PostConstruct init() 方法时(调试我可以看到 MyDao 注入得很好),会得到下一个 Hibernate 异常:
org.hibernate.HibernateException:没有找到当前线程的会话
我的服务实施。
@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());
}
...
}
Run Code Online (Sandbox Code Playgroud)
解决方法
正如@ 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;
}
});
}
...
}
Run Code Online (Sandbox Code Playgroud)
@PostConstruct我认为级别上不允许有任何交易,因此除非设置为in @Transactional,否则这里不会做太多事情。modeaspectj<tx:annotation-driven mode="aspectj" />
根据此讨论,您可以使用TransactionTemplate在内部启动手动事务init()来绑定session,但如果您打算严格遵守声明性事务,则需要使用ApplicationListener注册事件和用户ContextRefreshedEvent来启动事务。
| 归档时间: |
|
| 查看次数: |
4590 次 |
| 最近记录: |