为什么使用OpenSessionInViewFilter和Hibernate,我们需要使用下面的代码并在更新期间手动刷新对象!
sessionFactory.getCurrentSession().flush();
即使我们在Service类上注释@Transactional,其预期行为是spring transaction manager负责上述任务。
奇怪且不一致或我遗失了什么?
答案 0 :(得分:1)
使用OSIV,Hibernate Session甚至可以在服务层边界之外保持打开状态。
但它是负责交易逻辑的服务层,所以默认的刷新模式是MANUAL。在服务层中,刷新模式切换回AUTO,同时返回MANUAL以查看视图部分。
视图部分将要求会话打开,但由于实体仍然连接,您不希望任何更改传播到数据库。这就是为什么你禁用UI呈现阶段的自动刷新的原因。
至于手动调用冲洗,我怀疑你需要它。 Spring和Seam都有事务管理支持,并且由OSIV实现者负责刷新。
您需要read this too并自行决定whether it's worth the trouble。我曾经只使用过一次,因为我认为OSIV是一种货物崇拜节目'反模式。
答案 1 :(得分:1)
将事务管理器配置从调度程序
移动到应用程序上下文xml后解决此主题中的更多详细信息:Hibernate Update Problems - OpenSessionInViewFilter