MyDao类有通过Hibernate SessionFactory完成整个持久性任务的方法,它工作得很好。
如上所示,我在MyService中注入了MyDao,但是在注入MyDao后调用@PostConstruct init()方法(调试时,我可以看到MyDao被很好地注入)时,会出现下一个Hibernate异常:
org.hibernate.Hibernate异常:没有找到当前线程的会话
我的服务实现。
@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在与Bean构建相关的MyServiceImpl之后调用了MyServiceImpl.init(),并且没有使用@Transaction注释来管理会话生命周期。使用缓存而不是@PostConstruct
确保您正在事务下运行。我可以看到事务注释,但您似乎没有通过使用using激活事务管理
我认为在@PostConstruct
级别上不允许任何事务,因此@Transactional
在这里不会有太大作用,除非中的
模式设置为
aspectj
根据本讨论,您可以使用
TransactionTemplate
在init()内启动手动事务
绑定会话
但如果您打算严格遵守声明性事务,则需要使用ApplicationListener
注册事件,并使用ContextRefreshedEvent
启动事务。
Grails 3.2.9 执行任务后,onComplete方法无法获取hibernate会话。 控制器: 服务: 异常堆栈跟踪 2017-05-23 13:41:29.123[ead 6]错误异步执行错误:无法获取当前Hibernate会话;嵌套的异常是org。冬眠HibernateException:未找到当前线程的会话 组织。springframework。刀。DataAccessResour
早上好, 当我从Hibernate3升级到4时,出现了“臭名昭著的”当前会话错误。我搜索了一下,似乎一切都安排妥当了。我需要一些洞察力:) 这是我的配置:Spring3.2Hibernate4.1.9 数据源上下文: 业务背景: 我的服务层: 最后,DAO实现: 这里是stackTrace: 谢谢你的帮助! 编辑: 好的,我清理了配置文件,现在: 对于DAO: 对于业务层: 并从DAO中删除@Tr
问题内容: 有没有一种方法可以在PHP中启动持久性会话而无需放置会话cookie?是否还有其他方法可以跨页面维护会话,例如基于IP地址的解决方案? 我问的原因是,尽管大多数用户都启用了cookie,但我想看看是否有一种方法可以使禁用它的用户使用登录系统(即使我个人认为禁用cookie只是不必要的偏执狂)。 问题答案: 我认为要求您的用户启用Cookie并不过分。当人们完全关闭它们时,我觉得很愚蠢。
问题内容: 我正在使用Node.js,Express和Redis构建一个用于会话管理的网站。无论出于何种原因,如果我有一个会话变量(在此示例中),并且刷新页面,则不会保存该变量,但是,如果我在设置了变量后调用,则确实会将其保存到Redis(redis- cli监视器显示此内容-不调用表示变量不存在,而调用则显示该变量)。 我正在使用它来设置和启动服务器: 然后,在那条路线中,我有: 由此,我应该能
问题内容: 要获得答案,请向下滚动到此内容的结尾… 基本问题与多次询问相同。我有一个带有两个POJO事件和用户的简单程序-一个用户可以拥有多个事件。 用户: 注意:这是一个示例项目。我 真的 很想在这里使用Lazy抓取。 现在我们需要配置spring和hibernate,并有一个简单的basic-db.xml用于加载: 注意:我玩过CustomScopeConfigurer和SimpleThrea
我使用的是Spring框架和hibernate,我在其中映射了@OneToMany,当我加载类别来创建新产品时,我得到一个错误:在hibernate中用映射惰性地初始化集合失败,我以前看到过一些说明,请删除FectType。懒惰和我这样做了,但仍然没有效果 类别JAVA Product.java 我在用JPA 这是控制器的代码 product-form.jsp 但我得到错误 "我不知道哪里错了,我