Hibernate确实功能强悍但在易用性性能上存在缺陷如果团队中没有一个精通Hibernate的高手不适合使用Hibernate
复杂的实体状态
各种实体状态的设计是种种复杂性问题的根源在持久化状态下不需要save就自动同步到数据库既无必要又容易造成烦恼
Lazy Load 与 Eager Load
Lazy Load的概念听起来不错用起来就不那么妙了也直接导致产生了Open Session In View这种妥协方案此外在domain类中定义的FetchType只针对get/load/loadAll有效对Query是无效的需要再次定义
Open Session In View
Lazy Load引发的一个有较多副作用的解决方案
级联
级联是一个很好很OO的概念但往往增加了复杂度
批量更新与缓存不一致
Hibernate引入了一级缓存和二级缓存提供了性能的同时带来了缓存一致性的问题批量更新或者其他系统对数据库的更新容易造成缓存不一致
配置繁琐
Hibernate最初只能使用xml进行配置后来终于引入了Annotation和CoC(约定优于配置)来简化配置但这种变革并不彻底Hibernate默认把userName映射userName但实际开发中把userName映射为user_name的情况更多些
HQL
HQL是一个类SQL对象查询语言但正是因为HQL与SQL的相似性往往容易造成混淆同时HQL难以调试本质创建了一种语言增加学习成本
太多的查询方案
HQLQBCSQL就不能统一点简洁点?
N+次查询
性能问题
总之Hibernate立足于作一个完整的自动化的能够适应各种环境的ORM因此带来了%的复杂性但我们实际需要的只是一个简单的能够以%时间解决%问题的框架具有对象关系映射能自动生成SQL能够让新手尽快工作就足够了也许ActiveRecord是一个选择