没有一个简单答案的好问题。
在多年来在多个项目中使用 Hibernate 之后,我曾经是 Hibernate 的忠实粉丝。
我曾经认为任何项目都应该默认休眠。
今天我不太确定。
Hibernate(和 JPA)在某些方面非常有用,尤其是在开发周期的早期。
使用 Hibernate 比使用 JDBC 要快得多。
您可以免费获得许多功能 - 缓存、乐观锁定等。
另一方面,它有一些隐性成本。 Hibernate 启动时非常简单。遵循一些教程,在你的课堂上添加一些注释——你就有了自己的坚持。但这并不简单,要能够在其中编写好的代码需要对它的内部工作和数据库设计都有很好的理解。如果您刚刚开始,您可能不知道以后可能会遇到的一些问题,所以这里是一个不完整的列表。
性能
运行时性能足够好,我还没有看到休眠是生产性能不佳的原因。问题在于启动性能以及它如何影响您的单元测试时间和开发性能。当休眠加载它分析所有实体并进行大量预缓存 - 对于不是很大的应用程序可能需要大约 5-10-15 秒。所以你的 1 秒单元测试现在需要 11 秒。不好玩。
数据库独立性
只要你不需要对数据库做一些微调就很酷了。
内存中会话
对于每个事务,Hibernate 都会在内存中为它“接触”的每个数据库行存储一个对象。当您进行一些简单的数据输入时,这是一个很好的优化。但是,如果您出于某种原因需要处理大量对象,则可能会严重影响性能,除非您自己明确且仔细地清理内存中的会话。
级联
级联可让您简化对象图的使用。例如,如果您有一个根对象和一些子对象,并且您保存了根对象,那么您也可以配置 hibernate 来保存子对象。当您的对象图变得复杂时,问题就开始了。除非你非常小心并且对内部发生的事情有很好的理解,否则很容易把事情搞砸。当你这样做时,很难调试这些问题。
延迟加载
延迟加载意味着每次加载对象时,hibernate 不会加载所有相关对象,而是会提供占位符,一旦您尝试访问它们就会被解析。优化不错吧?是的,除非你需要注意这种行为,否则你会得到神秘的错误。例如,谷歌“LazyInitializationException”。并注意性能。根据您加载对象和对象图的顺序,您可能会遇到“n+1 选择问题”。谷歌它以获取更多信息。
架构升级
Hibernate 只需重构 java 代码并重新启动即可轻松更改架构。当你开始的时候很棒。但是随后您发布了第一版。除非您想失去您的客户,否则您需要向他们提供架构升级脚本。这意味着不再需要进行简单的重构,因为所有模式更改都必须在 SQL 中完成。
视图和存储过程
Hibernate 需要对其使用的数据进行独占写入访问。这意味着您不能真正使用视图、存储过程和触发器,因为它们会导致数据发生更改,而 hibernate 不知道它们。您可以让一些外部进程在单独的事务中将数据写入数据库。但如果这样做,您的缓存将包含无效数据。还有一件事需要关心。
单线程会话
Hibernate 会话是单线程的。通过会话加载的任何对象都只能从同一个线程访问(包括读取)。这对于服务器端应用程序是可以接受的,但如果您正在执行基于 GUI 的应用程序,则可能会使不必要的事情复杂化。
我想我的意思是没有免费的饭菜。
Hibernate 是一个很好的工具,但它是一个复杂的工具,需要时间来正确理解它。如果您或您的团队成员不具备这些知识,那么为单个应用程序使用纯 JDBC(或 Spring JDBC)可能更简单、更快捷。另一方面,如果您愿意花时间学习它(包括边做边学和调试),那么您将能够更好地理解权衡。