【问题标题】:Difference between EclipseLink and Hibernate for long running sessions (Vaadin 7 and JPAContainer)EclipseLink 和 Hibernate 用于长时间运行会话的区别(Vaadin 7 和 JPAContainer)
【发布时间】:2014-09-15 14:10:36
【问题描述】:

虽然我需要这个答案来更好地了解如何在 Wildfly 8.1 中集成 Vaadin 7 和 JPAContainer 插件,但这是一个适用于 Hibernate 和 Eclipse-link JPA 实现的一般问题。

JPACaontainer Vaadin Addon 建议为整个 servlet 会话使用 EntityManager,这个 IMO 不是好的设计,因为 AFAIK(请纠正我)扩展它总是更好地使用无状态 EntityManager-Per-Request 模式

JPAContaner 插件声明:

  1. Hibernate 不能长时间保持实体管理器没有问题。
  2. Hibernate 的一个问题是它是为短期会话而设计的,但实体管理器的生命周期通常与用户会话(读取、servlet 会话)的生命周期大致相同。问题是,如果会话或实体管理器中发生错误,管理器将变得无法使用。这会导致在 EclipseLink 上可以正常工作的长期会话出现大问题。

Hibernate 和 EclipseLink 之间的区别是什么,在实现级别上使这两个陈述成立?或者,这两个陈述首先是否有效?

【问题讨论】:

标签: java hibernate jakarta-ee jpa eclipselink


【解决方案1】:

我只能代表 Hibernate,所以这是我的想法:

  • Hibernate 支持long-conversations,你可以选择使用

    • “分离的对象”
    • “扩展会话”(与 DB 断开连接但尚未关闭的 Hibernate 会话)

    乐观锁定机制将防止丢失更新,因此对话越短,过时异常的可能性就越小。

    如果引发任何违反约束的情况,则会话确实无法使用,这使得“扩展会话”比使用“分离实体”更脆弱。

    使用分离的对象,您可以在整个对话过程中保留对您计划管理的那些实体的引用,并且仅在工作流完成时重新附加(或合并它们) 结束了。

  • 根据Hibernate Session docs

    如果Session抛出异常,事务必须滚动 返回并丢弃会话。 Session的内部状态 异常发生后可能与数据库不一致。

    如果内部 Session 状态不能再同步到数据库(由于约束违反异常或乐观锁定异常),则 Session 不再可用,您必须重新启动一个新的干净 Session。否则,只要当前实体过时或具有无效数据,您就会继续接收保存异常。

    另一种方法是清除 Session 并丢弃所有当前未决的更改,这些更改最终会引发异常,或刷新失败的实体。

我想知道 EclipseLink 是如何在这些情况下工作的,因为损坏的 Session 并不总是可以恢复的,比如当您有陈旧的数据并且刷新意味着“丢失更新”时。

【讨论】:

  • 我对 Hibernate 作为 JPA 实现的行为更感兴趣。那么,当您说“会话”时,我可以阅读“EntityManager”还是不同的东西?另外,如何在标准 JEE 中选择以使用“分离对象”或“扩展会话”?
  • Hibernate Session 与 JPA 的 EntityManager 相同。在标准 JEE 中,扩展的持久性上下文通常使用Stateful Session Beans 实现。 Adam Bien 的“重新思考最佳实践”就是这种模式的一个很好的例子。对于“分离的对象”,您只需将实体从服务层传递到视图层,它们就会“分离”,不再由持久性上下文管理。下一个请求可能会将“分离的实体”重新发送回服务。
  • 难以置信的有用答案。我对hibernate的了解超出了我的预期。现在它只是与 EclipseLink 的不同之处。我会等一下,也许有人指出 eclipse 链接是如何工作的。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 2012-11-20
  • 2010-09-26
  • 1970-01-01
  • 2010-11-05
  • 2020-08-30
相关资源
最近更新 更多