对于Java开发人员来说,什么比Hibernate更好?

ege*_*ari 7 java orm hibernate lazy-loading

我不确定是否有更好的方法来开发Java中的数据库支持的应用程序,但我想我会问.

我喜欢Hibernate,但也有很多问题.当你拥有和我一样多的经验时,他们中的大多数并不是那么重要,但我认为我遇到的最大问题是单一尺寸适合所有延迟加载模型.绝对讨厌它 - 那里必须有更好的东西......不是吗?

我讨厌延迟加载模型的原因是,虽然在配置文件中指定延迟和非延迟的内容很方便,但是应用程序的许多部分更喜欢在一个区域中进行延迟加载而在另一个区域中没有延迟加载.如果你想要满足程序的两个部分,你需要忍受延迟加载并手动加载实体及其子代......以及他们的孩子......等等.这只是膨胀,无法解决真正的编程问题 - 比如完成项目的功能.

看来你想要使用的加载策略应该独立于映射信息,但是除了在java代码中编写加载之外,这对hibernate来说是不可能的(据我所知).

我对延迟加载的另一个问题是,当你遇到问题时,它不容易预测.在将应用程序部署到Tomcat之前,我经常不会发现lazyloadexceptions.

当这些异常发生在框架中时,感觉更加臃肿 - 就像杰克逊调用尚未加载的集合一样.或者Spring可能正在访问我从未问过的属性,因此无论如何都会抛出一个LazyInitializationException - 除了他们的框架触及我的所有bean属性之外没有任何理由.

无论如何,因为我在集成测试期间无法发现这些问题...当我在Tomcat中发现它们时,我经常要关闭tomcat,进行更改,重新编译,重新加载tomcat,重新登录到我的应用程序,返回页面我在看它是否已修复 - 这确实是一次巨大的痛苦.修复其中一个错误需要很长时间.我觉得这只是妨碍了我实际做的事情.

最后,我觉得像这样的细节真的让我失望.当我看着我的日子并问:"我今天生产了什么?" - 我发现这样的问题确实让我觉得我觉得自己有所成就.

当然,我可以关闭延迟加载......但是后来我的表现非常糟糕.

有没有更好的办法?"做正确的事情",表现良好,更容易推理?

谢谢

les*_*es2 0

有人已经提到了“在视图中打开会话”,这将消除大多数(如果不是全部)延迟加载问题(但它也带来了自己的问题)。

Open JPA 有一个叫做“获取组”的东西。这基本上是一组命名的获取设置,您可以在运行查询等之前设置它们。然后,您可以在运行查询之前选择适当的获取策略(大概在您的服务实现中)。这样,获取计划与映射是分开的。您可以根据用例配置尽可能多的获取计划。在一个获取计划中,特定的关联是惰性的,但在另一个获取计划中,它是急切的/加入的。看起来棒极了。

如果您一直按照 JPA 规范而不是本机 Hibernate 进行编码,那么切换到 Open JPA 可能会很容易。

如果我没记错的话,正在做一些工作来在 Hibernate 中实现获取组,但我现在懒得用 google 搜索。