我的开发人员正在发动内战.在一个阵营中,他们已经接受了Hibernate和Spring.在另一个阵营中,他们谴责了框架 - 他们正在考虑Hibernate.
问题是:新手Hibernate-Spring皈依者是否有可能偶然发现任何令人讨厌的惊喜,弱点或陷阱?
PS:我们有一个不太复杂的DAO库.我怀疑它是否具有Hibernate的丰富性,但它已达到某种程度的成熟度(即它在包括的最后几个项目中没有被改变).
他们谴责框架?
那太疯狂了.如果您不使用现成的框架,那么您可以创建自己的框架.它仍然是一个框架.
我过去曾经多次使用过Hibernate.每次我遇到边缘情况,通过文档,Google和旧版本确定语法转换为清道夫狩猎.它是一个功能强大的工具,但记录不完整(最后我看).
至于Spring,几乎我在过去几年中所采访或看过的每一份工作都涉及到Spring,它实际上已成为Java/web的事实标准.使用它将有助于您的开发人员在未来更具市场价值,它将帮助您,因为您将拥有一大群能够理解您的应用程序的人.
编写自己的框架很有诱惑力,教育性和趣味性.结果不太好.
Hibernate有一些怪癖可以肯定,但这是因为它试图解决的问题很复杂.每当有人抱怨Hibernate时,我都会提醒他们所有无聊的DAO代码,如果他们不使用它们就必须维护这些代码.
一些提示:
Hibernate不能替代良好的数据库设计.Hibernate架构是可以的,但你必须偶尔调整它们
最终你将不得不理解Hibernate延迟加载类以及它如何影响事物.Hibernate修改了Java字节码,如果只解释对象链接为空的原因,您需要迟早深入研究深度.
如果可以,请使用注释.
花点时间学习Hibernate性能调优技术,从长远来看,它将为您节省时间.
如果你有一个相当复杂的数据库,Hibernate可能不适合你.在工作中,我们有一个包含大量数据的相当复杂的数据库,而Hibernate并不适用于我们.我们已经开始使用iBATIS了.但是,我知道很多开发商都成功地使用了Hibernate - 它确实为你做了很多繁重的工作 - 所以值得考虑.
如果你知道如何正确使用它,Spring是一个很好的工具.
我想说框架肯定是一件好事 - 就像其他人指出的那样,你不想重新发明轮子.Spring包含很多模块,这意味着你不必编写这么多代码.不要屈服于"未发明在这里"的综合症!
这是一件事(我记得),当我在Hibernate时代时,我陷入了困境.当您从集合中删除(多个)子对象(在父实体中),然后在一个事务中将新实体添加到同一集合中而不在中间刷新时,Hibernate将在"删除"之前执行"插入"操作.如果子表在其中一个列中有唯一约束,并且您希望不会违反它,因为您之前已经删除了一些数据(就像我一样),那么请准备好受挫.Hibernate论坛建议:
这是一个数据库设计缺陷,重新设计;
删除和插入之间刷新(或提交,如果你愿意);
我无法做到这两点,最终调整了Hibernate源代码并重新编译.它只有一行代码.但是找到一条线的努力相当于大约27杯咖啡和3个不眠之夜.
这只是你在使用Hibernate而你的团队中没有真正专家时遇到的问题和怪癖的一个例子(专家:对Hibernate的理念和内部工作有充分了解的人).你的问题,解决方案,一升咖啡和不眠之夜可能会有所不同.但是你明白了.
延迟加载是MVC应用程序中使用Hibernate作为持久性框架的重要问题.您在控制器中加载对象并将其传递给JSP视图.由于您在控制器完成时关闭了Hibernate会话,因此该类的部分或全部成员都被代理并且一切都爆炸了.
您需要阅读Open View in View文章以了解问题并获得解决方案.如果您使用的是Spring,那么这篇博客文章将介绍Spring视图中的open会话解决方案.
我没有使用Java,但我确实在大型Java开发人员组中工作.我得到的印象是春天还可以.但每个人都对Hibernate不满.一半的团队如果被问到"如果你能改变一件事,你会改变什么?" 他们会说"摆脱Hibernate." 当我开始学习Hibernate时,它让我感到非常复杂,但是我没有学到足够的东西(谢天谢地,我已经开始),知道复杂性是否合理(可能需要解决一些复杂的问题).
团队摆脱了Spring,转而支持Guice,但这更像是一场政治变革,至少从我的观点和我所谈过的其他开发者来看.
我总是觉得Hibernate有点复杂,难以学习.但是,由于JPA(Java Persistence API)和EJB(Enterprise Java Beans)3.0已经存在了一段时间,事情已经变得更加容易,我更喜欢通过JavaDoc或XML来注释我的类来创建映射.查看Hibernate中的支持.额外的好处是,如果需要,以后可以(但不是毫不费力地)更改数据库框架.我使用OpenJPA取得了很好的效果.
最近我越来越多地使用JCR(Java Content Repository).我喜欢我的模块可以共享单个数据存储的方式,并且我可以让结构和属性发展.我发现使用节点和属性更容易,而不是将我的对象映射到数据库.一个很好的实现是Jackrabbit.
至于Spring,它有很多我喜欢的功能,但配置所需的XML数量意味着我永远不会使用它.相反,我利用Guice并且非常喜欢它.
为了综合,我会向你怀疑开发人员如何让Hibernate让他们的生活更轻松.至于Spring,我会认真检查Guice是否是一个可行的选择,然后尝试展示Spring/Guice如何使开发更好,更容易.