Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate或TopLink的替代方案?_Java_Hibernate_Jpa_Jakarta Ee_Eclipselink - Fatal编程技术网

Java Hibernate或TopLink的替代方案?

Java Hibernate或TopLink的替代方案?,java,hibernate,jpa,jakarta-ee,eclipselink,Java,Hibernate,Jpa,Jakarta Ee,Eclipselink,有没有一种可行的方法可以替代冬眠?最好是不以JPA为基础的东西 我们的问题是,我们正在构建一个复杂的(如,许多对象相互引用)有状态RIA系统。Hibernate似乎主要用于一次性应用程序——JSF等 问题主要是延迟加载。由于在初始化和实际加载惰性集合之间可能存在多个HTTP请求,因此每个事务不可能有一个会话。长期会话(每个应用程序一个)也不能很好地工作,因为一旦事务遇到障碍并抛出异常,整个会话就会失效,因此延迟加载的对象就会中断。还有各种各样的东西不适合我们(比如隐式数据持久化来自初始化事务外部

有没有一种可行的方法可以替代冬眠?最好是不以JPA为基础的东西

我们的问题是,我们正在构建一个复杂的(如,许多对象相互引用)有状态RIA系统。Hibernate似乎主要用于一次性应用程序——JSF等

问题主要是延迟加载。由于在初始化和实际加载惰性集合之间可能存在多个HTTP请求,因此每个事务不可能有一个会话。长期会话(每个应用程序一个)也不能很好地工作,因为一旦事务遇到障碍并抛出异常,整个会话就会失效,因此延迟加载的对象就会中断。还有各种各样的东西不适合我们(比如隐式数据持久化来自初始化事务外部的数据)

撇开我糟糕的解释不谈,最重要的是Hibernate具有我们不喜欢的魔力。TopLink似乎没有任何改进,它也是在EJB之上编写的

因此,我们最需要的是无状态持久层(甚至是足够明亮的面向对象数据库抽象层)

有什么想法吗,还是我在要求一些不存在的东西


编辑:对于我含糊不清的术语,我深表歉意,感谢大家的更正和富有洞察力的回答。那些纠正我的人,你们都是对的,我指的是JPA,而不是EJB。

如果您在寻找另一个JPA提供商(Hibernate就是其中之一),那么请看一看。它的功能远比ToplinkEssentials的JPA1.0参考实现更全面。事实上,EclipseLink将是GlassFishV3最终版附带的JPA2.0参考实现

JPA很好,因为您可以在容器内外使用它。我已经编写了使用JPA的Swing客户端,效果很好。它没有EJB2.0/2.1所带来的污名和XML包袱

<>如果你在解决一个更轻的解决方案,那么不要再考虑了,我认为这是java平台的持久化技术。它是轻量级的,依赖于SQL(ORM用户花了多少时间试图让他们的ORM生成好的SQL,这令人惊讶),并且完成了JPA 90-95%的工作(如果您愿意,包括延迟加载相关实体)

只需纠正几点:

  • JPA是EJB的体验层,而不是构建在EJB上
  • 任何一个像样的JPA提供商都有大量的缓存,很难完全弄清楚(这是一个很好的例子,说明“为什么简单这么复杂?”)。除非您正在做一些您没有指示的事情,否则异常不应该成为托管对象的问题。运行时异常通常回滚事务(如果您使用Spring的事务管理,谁不这么做?)。提供程序将维护已加载或持久化对象的缓存副本。如果要在实体管理器之外进行更新(需要显式缓存刷新或使用
    EntityManager.refresh()
    ),这可能会有问题

我去年看过,它的轻巧无魔力设计给我留下了深刻的印象。现在似乎有一个版本3,但我没有这方面的经验。

Hibernate和Toplink(EclipseLink)都不是基于EJB的,它们都是POJO持久性框架(ORM)


我同意前面的回答:iBatis是ORM框架的一个很好的替代品:对sql的完全控制,具有良好的缓存机制。

另一个选项是Torque,我不是说它比上面提到的任何选项都好,而是说它是另一个值得考虑的选项。 它现在已经很旧了,但可能符合您的一些要求


我认为您应该看看哪一种是“大”框架的很好替代方案。有了像样的建模师,学习曲线会因为一个好的文档而缩短。

如前所述,JPA EJB,它们甚至都不相关。EJB3碰巧利用了JPA,但仅此而已。我们有一大堆使用JPA的东西,甚至都不接近于运行EJB

你的问题不在于技术,而在于你的设计

或者,我应该说,您的设计在几乎任何现代框架上都不是一件容易的事情

具体来说,您正试图通过几个HTTP请求保持事务的活动性

当然,大多数常见的习惯用法是,每个请求本身就是一个或多个事务,而不是每个请求都是更大事务的一部分

当您在同一讨论中使用术语“无状态”和“事务”时,也存在明显的混淆,因为事务本质上是有状态的

您的大问题只是手动管理事务

如果您的事务发生在多个HTTP请求上,并且这些HTTP请求恰好“非常快速”地一个接一个地运行,那么您不应该真的遇到任何实际问题,另外,您必须确保您的HTTP请求使用相同的DB连接,以便利用数据库事务功能

也就是说,简单地说,您获得一个到DB的连接,将其填充到会话中,并确保在事务期间,所有HTTP请求不仅通过同一个会话,而且以实际连接仍然有效的方式通过。具体来说,我不相信有现成的JDBC连接能够在从一台机器到另一台机器的故障切换或负载平衡中存活下来

因此,简单地说,如果您想使用DB事务,您需要确保您的数据库使用相同的DB连接

现在,如果长时间运行的事务中有“用户交互”,即启动DB事务并等待用户“做点什么”,那么很简单,这种设计都是错误的。您不想这样做,因为长期存在的事务,特别是在交互环境中,根本就是不好的。