EclipseLink 和 Hibernate 之间长时间运行会话的区别(Vaadin 7 和 JPAContainer)

Dav*_*ann 5 java hibernate jpa eclipselink jakarta-ee

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

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

JPAContaner 插件指出:

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

Hibernate 和 EclipseLink 在实现级别上有什么区别,使得这两种说法成立?或者,这两个陈述首先仍然有效吗?

Vla*_*cea 5

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

  • Hibernate 支持长时间会话,您可以选择使用

    • “分离的物体”
    • “扩展会话”(与数据库断开连接的 Hibernate 会话,但尚未关闭)

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

    如果抛出任何约束违规,会话确实无法使用,这使得“扩展会话”比使用“分离实体”更脆弱。

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

  • 根据Hibernate Session 文档

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

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

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

我想知道 EclipseLink 如何在这些场景中工作,因为损坏的会话并不总是可恢复的,就像当您拥有过时的数据并且刷新将意味着“丢失更新”时。