HIBERNATE介绍

原创 2004年08月04日 14:12:00

先介绍下概念:Hibernate是一个开放源代码的O/R Mapping (对象关系映射框架),它对JDBC进行了轻量级的对象封装,使Java程序员可以随心所欲的使用对象编程思维来操纵数据库。这段话是从HIBERNATE中文网上摘下来的,实际上HIBERNAMTE和JDO是处于同一层面的东西,只不过JDO在国内的名气更大点。下面这篇文章是从《hibernate中文网》上摘下来的,作为我的BLOG的存档,具体网址为:http://www.hibernate.org.cn/84.html

POJO 与 PO的 概念

POJO = pure old java object or plain ordinary java object or what ever.

PO = persisent object 持久对象

就是说在一些Object/Relation Mapping工具中,能够做到维护数据库表记录的persisent object完全是一个符合Java Bean规范的纯Java对象,没有增加别的属性和方法。全都是这样子的:

public class User { 
  private long id; 
  private String name;
  public void setId(long id) {
 this.id = id;
}  
public void setName(String name) {
this.name=name;
} 
 public long getId() {
 return id;
}  
public String getName() { 
return name;
}
}  

首先要区别持久对象和POJO。

持久对象实际上必须对应数据库中的entity,所以和POJO有所区别。比如说POJO是由new创建,由GC回收。但是持久对象是insert数据库创建,由数据库delete删除的。基本上持久对象生命周期和数据库密切相关。另外持久对象往往只能存在一个数据库Connection之中,Connnection关闭以后,持久对象就不存在了,而POJO只要不被GC回收,总是存在的。

由于存在诸多差别,因此持久对象PO(Persistent Object)在代码上肯定和POJO不同,起码PO相对于POJO会增加一些用来管理数据库entity状态的属性和方法。而ORM追求的目标就是要PO在使用上尽量和POJO一致,对于程序员来说,他们可以把PO当做POJO来用,而感觉不到PO的存在。

JDO的实现方法是这样的:

1、编写POJO

2、编译POJO

3、使用JDO的一个专门工具,叫做Enhancer,一般是一个命令行程序,手工运行,或者在ant脚本里面运行,对POJO的class文件处理一下,把POJO替换成同名的PO。

4、在运行期运行的实际上是PO,而不是POJO。

该方法有点类似于JSP,JSP也是在编译期被转换成Servlet来运行的,在运行期实际上运行的是Servlet,而不是JSP。

Hibernate的实现方法比较先进:

1、编写POJO

2、编译POJO

3、直接运行,在运行期,由Hibernate的CGLIB动态把POJO转换为PO。

由此可以看出Hibernate是在运行期把POJO的字节码转换为PO的,而JDO是在编译期转换的。一般认为JDO的方式效率会稍高,毕竟是编译期转换嘛。但是Hibernate的作者Gavin King说CGLIB的效率非常之高,运行期的PO的字节码生成速度非常之快,效率损失几乎可以忽略不计。

实际上运行期生成PO的好处非常大,这样对于程序员来说,是无法接触到PO的,PO对他们来说完全透明。可以更加自由的以POJO的概念操纵PO。另外由于是运行期生成PO,所以可以支持增量编译,增量调试。而JDO则无法做到这一点。实际上已经有很多人在抱怨JDO的编译期Enhancer问题了,而据说JBossDO将采用运行期生成PO字节码,而不采用编译期生成PO字节码。

另外一个相关的问题是,不同的JDO产品的Enhancer生成的PO字节码可能会有所不同,可能会影响在JDO产品之间的可移植性,这一点有点类似EJB的可移植性难题。


由这个问题另外引出一个JDO的缺陷。

由于JDO的PO状态管理方式,所以当你在程序里面get/set的时候,实际上不是从PO的实例中取values,而是从JDO State Manager?中取出来,所以一旦PM关闭,PO就不能进行存取了。

在JDO中,也可以通过一些办法使得PO可以在PM外面使用,比如说定义PO是transient的,但是该PO在PM关闭后就没有PO identity了。无法进行跨PM的状态管理。

而Hibernate是从PO实例中取values的,所以即使Session关闭,也一样可以get/set,可以进行跨Session的状态管理。

在分多层的应用中,由于持久层和业务层和web层都是分开的,此时Hibernate的PO完全可以当做一个POJO来用,也就是当做一个VO,在各层间自由传递,而不用去管Session是开还是关。如果你把这个POJO序列化的话,甚至可以用在分布式环境中。(不适合lazy loading的情况)

但是JDO的PO在PM关闭后就不能再用了,所以必须在PM关闭前把PO拷贝一份VO,把VO传递给业务层和web层使用。在非分布式环境中,也可以使用ThreadLocal模式确保PM始终是打开状态,来避免每次必须进行PO到VO的拷贝操作。但是不管怎么说,这总是权宜之计,不如Hibernate的功能强。

Hibernate简单介绍

. Hibernate介绍:      Hibernate是一个开源的对象关系映射框架,它对JDBC进行了轻量级的对象封装,使Java程序员可以随心所欲的使用对象编程思维来操纵数据库。它不仅提供了从...
  • clypm
  • clypm
  • 2014年03月20日 11:07
  • 1522

Hibernate框架(一)——总体介绍

作为SSH三大框架之一的Hibernate,是用来把程序的Dao层和数据库打交道用的,它封装了JDBC的步骤,是我们对数据库的操作更加简单,更加快捷。利用Hibernate框架我们就可以不再编写重复的...
  • liujiahan629629
  • liujiahan629629
  • 2014年03月18日 09:40
  • 20097

Hibernate旅程(一)Hibernate架构概述

Hibernate引出 曾学过三层架构,三层分别为界面层、业务逻辑层、数据持久层。在javaweb中,界面层和业务逻辑层可以使用struts框架来封装一些常用的操作。而在我们的数据持久层中,对数据库的...
  • lovesummerforever
  • lovesummerforever
  • 2014年02月13日 19:13
  • 8404

hibernate介绍

  • 2015年05月29日 18:14
  • 2KB
  • 下载

hibernate(api_介绍)

  • 2013年07月25日 14:54
  • 84KB
  • 下载

Hibernate的介绍

  • 2014年04月04日 17:42
  • 32KB
  • 下载

04.拓薪教育-hibernate4.3官方核心包介绍.part1

  • 2015年12月09日 06:23
  • 49MB
  • 下载

spring-struts1-strust2-hibernate 核心包介绍

  • 2008年09月20日 10:20
  • 27KB
  • 下载

Hibernate介绍

  • 2010年08月05日 17:15
  • 818KB
  • 下载

hibernate介绍与动手入门体验

  • 2011年12月27日 10:23
  • 802KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HIBERNATE介绍
举报原因:
原因补充:

(最多只允许输入30个字)