zoukankan      html  css  js  c++  java
  • 粗略看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了解的朋友拍砖或者指点。

  • 相关阅读:
    2019-9-2-简单搭建自己的博客
    2018-7-15-WPF-在-DrawingContext-的-push-如何使用
    2018-7-15-WPF-在-DrawingContext-的-push-如何使用
    2019-7-3-Roslyn-理解-msbuild-的清理过程
    2019-7-3-Roslyn-理解-msbuild-的清理过程
    MySQL数据库事务详解
    求一个Map中最大的value值,同时列出键,值
    Struts1入门实例(简单登录)
    java字符流操作flush()方法及其注意事项
    HDU 1874 畅通工程续 2008浙大研究生复试热身赛(2)
  • 原文地址:https://www.cnblogs.com/jobs/p/34669.html
Copyright © 2011-2022 走看看