Hibernate:简介

使用面向对象编程语言来连接数据库并获取信息是一件繁杂而又耗时的工作。以Java语言和JDBC为例,为了从数据库表中获取一条记录并将该记录中的信息存放到某个相应的对象中,开发人员不得不书写以下近30行的代码:

Connection conn = null;  
PreparedStatement stmt = null;  
ResultSet rs = null;

try {  
  conn = dataSource.getConnection();
  stmt = conn.prepareStatement("SELECT id,first_name,last_name FROM Employee WHERE id=?");
  stmt.setInt(1, id);
  rs = stmt.executeQuery();

  Employee employee = null;
  if (rs.next()) {
    employee = new Employee();
    employee.setId(rs.getInt(1));
    employee.setFirstName(rs.getString(2));
    employee.setLastName(rs.getString(3));
  }
  return employee;
} catch (SQLException e) {
} finally {
  try {
    if (rs != null) {rs.close();}
    if (stmt != null) {stmt.close();}
    if (conn != null) {conn.close();}
  } catch (SQLException e) {
  }
}

问题分析

从技术实现的角度上来看,这一问题集中在三个方面:

  1. Boilerplate Code (样板代码)。在上面的例子中,真正用来实现功能的代码不超过5行,剩下的都是样板代码,这增加了程序编写的时间,同时也增加了后期维护的成本。
  2. 对于异常的处理。当数据库发生问题的时候,除了提示错误信息,应用程序代码所能做的事情并不多。因此,任何与数据库操作相关的异常都应该属于RuntimeException才对。不幸的是,SQLException属于CheckedException,并且JDBC中有多个常用操作均抛出该异常,这导致代码中出现了大量无谓的异常处理语句。
  3. 数据库兼容性。当数据库发生变化时,已经写好的应用程序代码必须进行修改、优化和重新测试,这使得后期维护成本大大增加。

而从抽象的角度上来看,无论是应用程序执行时所使用的一个又一个对象,还是数据库运行时表中一条又一条的记录,其实质是一样的:都保存了某个实例(instance)的信息。以上述代码为例,程序中的Employee对象与数据库中Employee表的记录,其保存的信息是一一对应的。更简单的说,数据库表中一条又一条的记录,其实就是一个又一个的对象。然而,从上面的代码中可以看到,在将程序中的对象和数据库表中的记录进行相互转换的过程中,直接使用Java是非常繁琐而又低效的,程序并不直观,同时也缺乏可维护性。

ORM与Hibernate

为了解决这一问题,诞生了对象/关系映射(ORM)技术。对象/关系映射(ORM)指的是在对象模型和关系型数据库模型之间进行映射的技术。简而言之,对于某个实例(instance),ORM会在其编程语言中的实现(对象)和其在数据库中的实现(表记录)之间做相互转换,从而降低开发成本、提高产品质量。而Hibernate就是Java环境中ORM技术的一个实现框架:在Java对象和数据库表记录之间进行映射。除此之外,Hibernate还提供了一些数据库查询相关的辅助工具。因此,与直接使用SQL和JDBC相比,使用Hibernate可以大幅减少开发时间,而产品代码的可读性、可维护性也更强。

不过,Hibernate并不是Java平台上访问数据库的银弹。对于以数据操作为主,仅仅使用存储过程来完成业务逻辑的应用程序来说,由于不需要将数据库表中的记录转换为Java对象,因此ORM技术和Hibernate在这种情况下并不是太契合。

Hibernate与SQL

熟练地书写SQL语句对于使用Hibernate并不是必须的。不过,对SQL语句和关系型数据库模型有一个基本的了解有利于更快、更全面地理解Hibernate。

虽然如此,与别的一些持久层工具相比,Hibernate允许直接进行SQL语句调用;也就是说,在使用Hibernate的同时,依然可以通过原始的SQL调用来完成工作,从而保证了对数据库操作的灵活性和全面性。

Hibernate的下载

Hibernate的下载包部署在Sourceforge上,可以通过以下链接下载到:
http://sourceforge.net/projects/hibernate/files/hibernate4/

在下载包中,比较重要的几个地方是:

  • /lib/required/。该文件夹中包含所有使用Hibernate所必需的jar包,这些jar包必须放在开发项目的CLASSPATH中。
  • /lib/jpa/。该文件夹中包含启用JPA支持所需要的jar包,主要是hibernate-entitymanager-*.jar。
  • /lib/envers/。该文件夹中包含hibernate-envers-*.jar。
  • /lib/optional/。该文件夹中包含Hibernate的一些可选特性所需要的jar包。

本文参考:

http://docs.jboss.org/hibernate/orm/4.2/quickstart/en-US/html/pr01.html
http://docs.jboss.org/hibernate/orm/4.2/quickstart/en-US/html/ch01.html
http://www.habuma.com/spring/sia-sdug.pdf

Chuan Shao

Read more posts by this author.

Shanghai

Subscribe to Chuan's blog

Get the latest posts delivered right to your inbox.

or subscribe via RSS with Feedly!