我的开发者正在发动一场内战。在一个阵营中,他们拥抱了 Hibernate 和 Spring。在另一个阵营中,他们谴责框架 - 但他们正在考虑 Hibernate。

问题是:Hibernate-Spring 转换新手可能会遇到任何令人讨厌的意外、弱点或陷阱吗?


附:我们有一个不是很复杂的 DAO 库。我怀疑它是否具有 Hibernate 的丰富性,但它正在达到某种成熟度(即。在它包含的最后几个项目中它没有改变)。

有帮助吗?

解决方案

我过去曾多次使用过 Hibernate。每次我遇到边缘情况时,确定语法都会变成通过文档、Google 和旧版本进行寻宝游戏。它是一个强大的工具,但文档很少(我上次查看)。

至于Spring,过去几年我面试过或看过的几乎所有工作都涉及Spring,它确实成为了Java/web事实上的标准。使用它将帮助您的开发人员在未来更具市场竞争力,并且它将为您提供帮助,因为您将拥有大量能够理解您的应用程序的人员。

编写自己的框架很诱人、有教育意义且有趣。结果不太好。

其他提示

他们谴责了 构架?

那太疯狂了。如果您不使用现成的框架,那么您可以创建自己的框架。它仍然是一个框架。

Hibernate 确实有一些怪癖,但这是因为它试图解决的问题很复杂。每当有人抱怨 Hibernate 时,我都会提醒他们所有无聊的 DAO 代码,如果他们不使用它,他们就必须维护这些代码。

一些提示:

  • Hibernate 无法替代良好的数据库设计。Hibernate 模式没问题,但你偶尔需要调整它们
  • 最终,您将必须了解 Hibernate 延迟加载类的方式以及它如何影响事物。Hibernate 修改了 Java 字节码,如果只是为了解释为什么对象链接为空,您迟早需要深入研究。
  • 如果可以的话使用注释。
  • 花时间学习 Hibernate 性能调优技术,从长远来看它会节省你的时间。

如果您有一个相当复杂的数据库,Hibernate 可能不适合您。在工作中,我们有一个相当复杂的数据库,其中包含大量数据,而 Hibernate 并不真正适合我们。我们已开始使用 iBATIS。然而,我知道很多开发团队都成功地使用了 Hibernate——它确实为您做了很多繁重的工作——所以值得考虑。

如果你知道如何正确使用 Spring,它是一个很好的工具。

我想说框架绝对是一件好事——就像其他人指出的那样,你不想重新发明轮子。Spring 包含很多模块,这意味着您不必编写那么多代码。不要屈服于“不是这里发明的”综合症!

延迟加载是使用 Hibernate 作为持久性框架的 MVC 应用程序中的一大难题。您将对象加载到控制器中并将其传递到 JSP 视图。类的部分或全部成员都被代理,并且一切都会崩溃,因为控制器完成时您的 Hibernate 会话已关闭。

您需要阅读 在视图中打开会话 文章来了解问题并找到解决方案。如果你使用Spring这个 博客文章 描述了 Spring 对视图中打开会话问题的解决方案。

这是我在冬眠时期遇到的一件事(我记得)。当您从集合(在父实体中)中删除(多个)子对象,然后在一个事务中将新实体添加到同一集合中而不需要中间刷新时,Hibernate 将在“删除”之前执行“插入”操作。如果子表的其中一列有唯一约束,并且您希望不会违反它,因为您之前已经删除了一些数据(就像我一样),那么请准备好感到沮丧。Hibernate 论坛建议:

  1. 这是数据库设计缺陷,重新设计;
  2. 在删除和插入之间刷新(或提交,如果愿意的话);

我无法两者兼得,最终只能调整 Hibernate 源代码并重新编译。只有 1 行代码。但找到一条线的努力相当于大约 27 杯咖啡和 3 个不眠之夜。

这只是您在团队中没有真正专家的情况下使用 Hibernate 时可能会遇到的问题和怪癖的一个示例(专家:对 Hibernate 的哲学和内部工作原理有足够了解的人)。您的问题、解决方案、咖啡升数和不眠之夜的数量可能会有所不同。但你明白了。

我与 Java 相关的工作不多,但我确实在大型 Java 开发人员群体中工作过。我的印象是春天还可以。但每个人都对 Hibernate 感到不安。一半的团队问:“如果您可以更改一件事,您会改变什么?”他们会说“摆脱冬眠。”。当我开始学习 Hibernate 时,它​​给我带来了惊人的复杂性,但我学得还不够(谢天谢地,我已经进步了),无法知道复杂性是否合理(也许需要解决一些复杂的问题)。

团队放弃了 Spring,转而采用 Guice,但这更像是一次政治变革,至少从我和我交谈过的其他开发人员的角度来看是这样。

我一直觉得 Hibernate 有点复杂而且很难学。但作为 日本专业协会 (Java 持久性 API)和 EJB (Enterprise Java Beans) 3.0 已经存在一段时间了,事情变得容易多了,我更喜欢注释我的类以通过 JavaDoc 或 XML 创建映射。查看 休眠中的支持. 。额外的好处是,如果需要的话,以后可以(但并不轻松)更改数据库框架。我用过 OpenJPA 取得了很好的成果。

最近我一直在使用 JCR (Java内容存储库)越来越多。我喜欢我的模块可以共享单个数据存储的方式,并且我可以让结构和属性不断发展。我发现使用节点和属性比将对象映射到数据库要容易得多。一个好的实现是 长耳大野兔.

至于 Spring,它有很多我喜欢的功能,但是配置所需的 XML 量意味着我永远不会使用它。相反,我利用 吉斯 并且绝对喜欢它。

总而言之,我将向那些心存疑虑的开发人员展示 Hibernate 将如何让他们的生活变得更轻松。至于 Spring,我会认真检查 Guice 是否是一个可行的替代方案,然后尝试展示 Spring/Guice 如何使开发变得更好、更容易。

我做了很多 Spring/Hibernate 开发。随着时间的推移,人们结合使用两者的方式发生了一些变化。事实证明,最初的 HibernateTemplate 方法很难调试,因为它吞掉并包装了其他有用的异常;直接与 Hiberante API 对话!

请继续查看生成的 SQL(配置您的开发日志记录以显示 SQL)。拥有数据库抽象层并不意味着您不必再用 SQL 进行思考;而是意味着您不必再用 SQL 来思考。否则,你将不会获得良好的表现。

考虑这个项目。在我们有严格的性能要求、复杂的遗留模式或优秀的 DBa 能够编写出色的 SQL 的情况下,我曾多次选择 iBatis 而不是 Hibernate。

至于休眠:对于处理快速变化的数据库模式、大量表、执行大量简单的 CRUD 操作的应用程序来说,这是一个非常好的工具。涉及复杂查询的报告处理得不太好。但在这些情况下,我更喜欢混合使用 JDBC 或本机查询。因此,简短回答一下:我确实认为花时间学习 Hibernate 是一项很好的投资(他们说它也符合 EJB3.0 和 JPA 标准,但当我评估它供我个人使用时,这并没有考虑在内)。

至于春天...看 胆汁博客 :)

记住:框架不是 银弹, ,但你不应该 重新发明轮子 任何一个。

我发现使用 Hibernate 等知名框架确实很有帮助,因为它使您的代码适合特定的模型或思维方式。这意味着,由于您使用的是 Hibernate,因此您可以以某种方式编写代码,并且大多数(如果不是全部)了解 Hibernate 的开发人员都能够轻松地遵循您的思路。

当然,这有一个缺点。在您成为一名 Hibernate 开发高手之前,您会发现您正在尝试将一个正方形装入一个圆孔中。您知道自己想要做什么,以及在 Hibernate 出现之前应该如何做,但是找到 Hibernate 的实现方式可能需要......相当多的时间。

尽管如此,对于经常聘请顾问(需要在短时间内理解大量源代码)或开发人员频繁加入和退出的公司,或者您只是不想打赌您的关键开发人员会这样做的公司永远留下来,永不换工作——我认为 Hibernate 和其他标准框架是一个非常好的主意。

/高手

Spring 和 Hibernate 是很难掌握的框架。当您仍在尝试找出框架时,在期限紧迫的项目中使用它们可能不是一个好主意。

框架的好处基本上是尝试提供一个平台,允许一致的代码成为产品。根据经验,我们强烈建议您让具有框架设置最佳实践经验的开发人员。

根据应用程序和/或数据库的设计,您还需要避免一些怪癖,以确保框架不会影响性能。

在我看来,Spring 的最大优势在于它鼓励并实现更好的开发实践,特别是松耦合、测试和更多接口。没有 Spring 的 Hibernate 确实很痛苦,但是两者结合起来非常有用。

将现有项目改造为任何框架都会很痛苦,但重构过程通常对长期可维护性有很大好处。

我必须同意关于这一点的许多帖子。我在各种环境中广泛使用过这两种方法。如果我可以撤销一个设计决定,我会选择使用 Hibernate。实际上,我们在我们的一个产品中预算了一个版本,将 Hibernate 替换为 iBatis,将 Spring-JDBC 替换为世界上最好的方法。与我只让他们使用 Hibernate 相比,我可以让新开发人员更快地使用 Spring-JDBC、Spring-MVC、Spring-Ioc 和 iBatis。

对于这个 KISS 开发人员来说,Hibernate 太复杂了。如果您的 DBA 看到数据库看到的生成的 SQL 并将优化版本发送给您,那么天堂会帮助您休眠。

最上面的答案提到 Hibernate 的文档很少。我同意在线参考手册可以更完整。然而,Hibernate 作者写的一本书,'Java 与 Hibernate 的持久性' 是每个 Hibernate 用户必读的内容,而且非常完整。

@slim - 今天早上我又和你在一起了。

这听起来像是一个经典案例 不是这里发明的综合症. 。如果他们不热衷于 Spring,他们应该考虑其他选择,而不是推出自己的框架(无论他们是否承认这样做)。 吉斯 我想到了一种可能性。也是微微容器。还有其他的,取决于您的需要。

Spring 和 Hibernate 确实让生活变得更轻松。一开始使用它们可能会有点耗时,但稍后您肯定会从中受益。现在 XML 正在被注释所取代,您也不需要键入数百行 XML。

您可能需要考虑 应用熔断器 减少你的学习曲线:生成一个应用程序,研究并调整它,然后就可以开始了。

框架并不是邪恶的。甚至Java SDK也是一个框架。

他们可能会战斗的是 框架扩散. 。您不应该仅仅为了刺激而将框架引入项目,它应该在合理的时间内带来一致的价值。每个框架都需要一个学习曲线,但以后应该会通过提高生产力和功能来奖励您。

如果您因数据库使用不一致、缓存机制复杂或无数其他原因而难以调试代码。Hibernate 将增加巨大的价值。除了学习曲线(我花了大约 1 个月的实际工作时间)之外,只要有人为你解释基础知识,就没有任何陷阱。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top