【问题标题】:Using Hibernate or TomEE?使用休眠或 TomEE?
【发布时间】:2012-10-01 20:47:24
【问题描述】:

我有一个基于 EJB 的库,需要对其进行修改以与 Tomcat 应用程序服务器兼容(即没有 JaveEE)。我在 Hibernate 上浏览了一下,感到很困惑。

显然,有一个使用 .cfg 文件作为基础的自然 Hibernate 分支,它与 Java SE 兼容,然后有一个基于 JPA 的 Hibernate 分支,它有条件地依赖于 Java EE。我还觉得烦人的一件事是某些接口显然不受支持——例如 CriteriaQuery。

所以我想,我必须使用自然的 Hibernate 分支才能实现摆脱 Java EE 的目标(考虑到差异,这很烦人)。 OTOH,还有兼容 Tomcat 的 TomEE,大概让我保持大部分代码不变

如果我能得到一些反馈,那就太好了。谢谢。

【问题讨论】:

    标签: hibernate jakarta-ee jpa apache-tomee


    【解决方案1】:

    几点:

    • Hibernate 是一种 JPA 实现,是三种实现之一。 Gavin King,Hibernate 的创建者,在 JPA 上工作非常努力。从应用程序中删除所有 JPA 使用是向后移动,而不是向前移动。你只会失去便携性而没有收获。
    • 无论有无 TomEE,您都可以在 Tomcat 中使用 JPA。

    就讨厌 Java EE 并想摆脱它而言,这确实成为一项不可能完成的任务。所有这些技术都是 Java EE 的一部分:

    • 小服务程序
    • JSP
    • JSF
    • JPA
    • EJB
    • CDI / @Inject
    • JAX-RS
    • JAX-WS
    • JMS
    • Bean 验证

    将其中一些标记为 JavaEE 而另一些标记为非 JavaEE 是一种否定形式。它们都是作为 JavaEE 的一部分创建和发布的。

    要解决一些反 JavaEE 营销造成的混乱几乎是不可能的。真正具有破坏性的是,几乎不可能找到不使用 3 种或更多 JavaEE 技术的“非 JavaEE”应用程序。

    为了回答“重”问题和“太多”问题,2010 年创建了 Web Profile,以便可以在不牺牲可移植性的情况下创建更小的运行时。它包括:

    • 小服务程序
    • JSP
    • JSF
    • JPA
    • EJB(精简版)
    • CDI / @Inject
    • Bean 验证

    没有分布式事务,也没有繁重的东西。如果您堆叠 Tomcat、Hibernate 和 Spring,您将包括:

    • 小服务程序
    • JSP
    • JPA
    • @Inject
    • Bean 验证

    无论您是否选择使用这些 API,它们都会在那里。

    使用实现本身但不使用标准 API 几乎没有价值。这是一场虚假的胜利。您仍将使用相同的运行时代码,只是没有可移植性。

    【讨论】:

    • 感谢您阐明“Web Profile”堆栈,David。就我个人而言,我喜欢使用直接 API——在 Hibernate 之上的额外 API 层,以零收益增加了复杂性。从架构上讲,我不需要 Hibernate 的可移植性,我永远不需要它,并且假装我这样做是不正确的。
    • Hibernate 和 Spring 确实为此发明了 Java API 的良好风格。没有“反 JavaEE 营销”——只是人们对原始 J2EE 架构的侵入性、沉重和迟钝的准确印象。
    • 人们也准确地说 Java 很慢。事情发生了变化。
    【解决方案2】:

    spring framework 或 JavaEE 今天已经足够接近,可以根据您的喜好进行选择(个人认为是 Java EE,但您更喜欢 BMW 还是 Mercedes?:p)

    也就是说 JPA 规范不是最好的,你可以轻松地使用特定的行为链接到 hibernate/openjpa/eclipselink,甚至隐藏在 javax.persistence 包后面

    据说一旦学会了Java开发就可以轻松很多

    所以我的建议是:使用 TomEE,如果你发现某些东西确实阻碍了重写你不想要的东西,但 IMO 你会浪费时间

    【讨论】:

      【解决方案3】:

      我不了解 TomEE —— 我希望如果您只是想部署到不同的 J2EE 容器中,您已经这样做了,并且不需要修改代码。

      也就是说,这意味着你想远离 EE。

      除非您拥有或将需要“分布式事务”或消息传递支持(例如,发往/来自 IBM 大型机),否则我认为 J2EE 在很大程度上是一个失败的架构。

      Tomcat、Spring 和 Hibernate 几乎可以独立使用(不使用 JPA 包装器或 API,它们大多只是从 Hibernate 最初的成功复制而来的额外抄袭层)是我推荐的。

      如果您为 HB 配置添加注释,则可以在代码中使用 Hibernate API 时使用/组合 JPA 注释(有时它们具有更清晰的语法)。

      干杯,希望这会有所帮助。

      【讨论】:

      • 你能告诉我为什么 EE 是一个失败的架构 - 我真的很想知道你的意见。另外,我对在 Hibernate 中使用什么和不使用什么感到很困惑,因为它似乎有 2 个系统。如果我想远离 EE,那么我可以使用 JPA 的哪些方面?持久性.xml?注释?我不确定这里的优点,但我觉得 Hibernate 是一团糟。更不用说它缺乏对泛型的处理。但无论如何,我在转换为 Hibernate 框架方面进展顺利。
      • 我认为 Hibernate 的创建者 Gavin 不会将他在 JPA 中投入的令人难以置信的辛勤工作描述为“抄袭层”。
      • @ThomasW Gavin 是 JPA 的一股激动人心的主导力量。作为 CDI 规范负责人,他在 Java EE 6 中做出了更多贡献,并为创建 Web 配置文件发出了强有力的声音。
      • @ThomasW - Sun 抄袭 Log4j 成功的故事是什么?另外,我不认为 JPA 是骗人的。我喜欢 JPA 的一些东西不是本机 Hibernate 的一部分。例如,在 JPA 中创建 CriteriaQuery 允许强制编译时类型检查,而 Hibernate 的 Criteria 不支持这一点。此外,Session-Criteria 框架不支持泛型。
      • @ThomasW 我相信 Gavin 曾经解释过 JPA 让他有机会纠正 Hibernate 中的一些问题,因为兼容性在 Hibernate 本身中很难做到。 Joda Time 和 JSR 310 的情况类似。Joda Time 的作者 (Stephen Colebourne) 也是 JSR 310 的规范负责人。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-13
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      相关资源
      最近更新 更多