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

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

sessionFactory.getCurrentSession().flush();

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

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

【问题讨论】:

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

标签: java spring hibernate jpa orm


【解决方案1】:

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

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

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

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

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

【讨论】:

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

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

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

【讨论】:

    猜你喜欢
    • 2012-07-04
    • 1970-01-01
    • 2016-08-11
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    • 2014-02-03
    • 2010-11-13
    • 1970-01-01
    相关资源
    最近更新 更多