java - EclipseLink 和 Hibernate 之间长时间运行 session 的区别(Vaadin 7 和 JPAContainer)

标签 java hibernate jakarta-ee jpa eclipselink

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

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

JPAContaner Addon 指出:

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

Hibernate 和 EclipseLink 在使这两个陈述成立的实现级别上有什么区别?或者,这两个陈述一开始仍然有效吗?

最佳答案

我只能为 Hibernate 说话,所以这是我的想法:

  • Hibernate 支持 long-conversations你可以选择与

    • “分离对象”
    • “扩展 session ”(与数据库断开连接但未关闭的 Hibernate session )

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

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

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

  • 根据 Hibernate Session docs :

    If the Session throws an exception, the transaction must be rolled back and the session discarded. The internal state of the Session might not be consistent with the database after the exception occurs.

    如果内部 Session 状态不能再同步到数据库(因为 Constraint Violation Exceptions 或 Optimistic locking exceptions),Session 不再可用,你将不得不重新启动一个新的干净 Session。否则,只要当前实体陈旧或具有无效数据,您就会继续接收保存异常。

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

我想知道 EclipseLink 如何在这些场景中工作,因为中断的 Session 并不总是可以恢复的,就像当您有陈旧的数据时,刷新就意味着“丢失更新”。

关于java - EclipseLink 和 Hibernate 之间长时间运行 session 的区别(Vaadin 7 和 JPAContainer),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24926633/

相关文章:

java - 在swt中设置要为多行文本显示的行数

java - 来自 Java EE 应用程序服务器的数据流

java - 如何在 Spring boot 1.5.2 中终止 Hibernates 数据库连接?

java - 默认列值在 hibernate 中不起作用

java - 如何使用 JPA 和 Hibernate 避免产品销售的竞争条件

java - 在处理 xml 文件时将 === 字符存储在数据库中作为空数据

spring - 运行时出错 : java. lang.ClassNotFoundException : org. springframework.web.context.ContextLoaderListener

java - 以m_开头的成员变量命名符合javabean风格?

java - OnClickListener 只执行一次

java - 单元测试困境 : Using a JNDI data source without running JBoss or Spring