• 粗略看Hibernate的代码


    Hibernate大名鼎鼎,我在观看奥运的期间,也抽一些时间来阅读Hibernate的源码。我并没有把Hibernate跑起来,而是直接阅读其文档和源码。以下是我的一些观点:

    1、Hibernate普遍地使用了Cache,Cache这个咚咚,对于O-R Mapping来说,双刃剑。在例如论坛之类系统中,Cache的能够很显著提高性能。在ERP之类系统中,业务对象很多,数据量很大,广泛使用Cache机制,可能存在问题。这个观点,最初来自一个同事,我对此认同。

    2、Hibernate的代码质量并不是很优。很多地方都可以找出一些不好多的代码风格或者比较笨的作法。比较笨的实现,例如HQL的解释,看得出,作者在编译原理的文法解释方面并不擅长。不好的代码风格,例如:InformixDialect类中的代码:

    private static int getAfterSelectInsertPoint(String sql) {
        
    return sql.startsWith("select distinct"? 15 : 6;
    }

    这是一个使用了“魔数”的典型例子。在产生SQL的过程中,使用StringBuffer可能比直接使用String相加的方式要好一些,如果构建了SQL的抽象语法树,那样可能更好。构建SQL的抽象语法树,一个好处,可以随机构建SQL,不必拘泥于顺序。不过,这些都是实现细节的问题,并非硬伤。

    3、Hibernate支持多数据库的方式可行,但并不是很好的办法,而且能力有限。例如:现有的框架,要支持Oracle 8i应该是不行的。我曾经写过一篇文章介绍支持多数据的思路:
    http://www.cnblogs.com/jobs/articles/22878.aspx

    4、Hibernate并没有明确区分ObjectQuery和DataQuery的概念。对象的查询,目前Hinbernate的hql,我觉得抽象的不够好。Hibernate中,没有DataQuery的概念,不适合之需要数据不构造对象的情形,例如报表。

    5、Hibernate非常强调作为一个O-R Mapping的Tool,对Model不够重视,并没有体现“模型驱动”和“产生式编程”的概念。如果强调“模型驱动”和“产生式编程”,应该包括三个部分:对象元数据管理、根据元数据产生代码、运行期O-R Mapping引擎。Hinbernate似乎在根据元数据产生代码方面比较弱。

    6、Hibernate有一个比较Cool的功能,外连接抓取。这样能够提高多级对象的查询性能。

    由于我对Hibernate了解不够深入,上述观点可能并不全面,抑或有错漏,望对Hibernate了解的朋友拍砖或者指点。

  • 相关阅读:
    var与dynamic
    SQL Server占用服务器内存过高
    SQL SERVER 2012/ 2014 分页,用 OFFSET,FETCH NEXT改写ROW_NUMBER的用法
    SQL Server 2012 OFFSET/FETCH NEXT分页示例
    Solr初始化源码分析-Solr初始化与启动
    (c#) 销毁资源和释放内存
    C#中 ThreadStart和ParameterizedThreadStart区别
    MongoDB的C#封装类
    mongo DB for C#
    C#操作MongoDB
  • 原文地址:https://www.cnblogs.com/jobs/p/34669.html
Copyright © 2020-2023  润新知