更新期间休眠不刷新

Posted

技术标签:

【中文标题】更新期间休眠不刷新【英文标题】:Hibernate not flushing during update 【发布时间】:2014-05-29 18:23:52 【问题描述】:

为什么使用 OpenSessionInViewFilter 和 Hibernate,我们需要使用下面的代码并在更新期间手动刷新对象!

sessionFactory.getCurrentSession().flush();

即使我们在预期行为是 Spring 事务管理器负责上述职责的 Service 类上注释 @Transactional。

奇怪和不一致还是我遗漏了什么?

【问题讨论】:

这不应该是必需的,所以我会说你的设置有问题。 好吧,据我所知,我真的看不出我的设置有什么问题。如果你可以看看我发布了我的整个代码的这个线程,也许你可以帮我。谢谢***.com/questions/23938580/… 你会尝试使用DataSourceTransactionManager而不是HibernateTransactionManager吗? 当然,会试试看...谢谢... 【参考方案1】:

使用 OSIV,即使超出服务层边界,休眠会话仍保持打开状态。

但是负责事务逻辑的是服务层,所以默认的刷新模式是手动的。在服务层中,刷新模式切换回 AUTO,而视图部分返回 MANUAL。

视图部分将要求会话打开,但由于实体仍附加,您不希望将任何更改传播到数据库。这就是您在 UI 呈现阶段禁用自动刷新的原因。

至于手动调用刷新,我怀疑你需要那个。 Spring 和 Seam 都支持事务管理,并且刷新由 OSIV 实现者负责。

您需要read this too 并自行决定whether it's worth the trouble。自从我将 OSIV 视为“货物崇拜编程”反模式以来,我只使用过一次。

【讨论】:

是的,我已经理解了 OSIV 背后的整个概念,并且仅在服务层(我们声明 @Transactional 注释)将刷新模式设为自动。就像您提到的那样,理想情况下 Spring 必须处理这个问题,它在保存对象时这样做,但是在更新对象时,由于某种原因,它根本没有刷新......我已经发布了我的整个代码在下面的线程中,如果您能通过它并帮助我,将不胜感激:***.com/questions/23938580/… 感谢您提供的链接...它们非常有趣。【参考方案2】:

在将事务管理器配置从调度程序移动到应用程序上下文 xml 后解决

更多详情见此帖:Hibernate Update Problems - OpenSessionInViewFilter

【讨论】:

以上是关于更新期间休眠不刷新的主要内容,如果未能解决你的问题,请参考以下文章

休眠 - 批量更新从更新返回意外的行数:0 实际行数:0 预期:1

Android中使用ListView实现分页刷新(线程休眠模拟)

Android中使用ListView实现分页刷新(线程休眠模拟)(滑动加载列表)

设备休眠时的 Alamofire 请求

您如何测试 Spring @Transactional 而不只是命中休眠级别 1 缓存或进行手动会话刷新?

带有休眠应用程序的 Spring Boot 无法启动