Hibernate入门

来源:互联网 发布:免费朗读软件 编辑:程序博客网 时间:2024/05/01 12:03

Hibernate入门

 

Hibernate概述

Hibernate是非常优秀、成熟的O/R Mapping框架。它提供了强大、高性能的Java对象和关系数据的持久化和查询功能。

 

O/R Mapping是一项实用的工程技术,把数据库的E/R模型用javaOO语法描述出来,Hibernate是其中的当之无愧的最耀眼的明星,cglib动态增强,多种灵活的class继承树映射机制,广泛的社团支援,掩盖了其他项目的光辉。)

Hibernate的优势

¨  开源(LGPL)

¨  成熟

¨  流行(13 000 downloads/month)

¨  自定义API

JBoss 将用Hibernate3实现Entity Beans

使用Hibernate的开发步骤

1、  设计

一般首先进行领域对象的设计。因为在Hibernate中,我们的领域对象可以直接充当持久化类。

2、  映射

定义Hibernate的映射文件,实现持久化类和数据库之间映射。

3、  应用

使用Hibernate提供的API,实现具体的持久化业务。

 

Hibernate的映射

Entity-hbm-ddl(数据库)hbmhibernate mapping)和ddlData Definition Language)的全称)

『之间的互相转换』

 

User.java User.hbm.xml

 

XDoclet:它通过在Java源代码中加入特定的JavaDoc tag,从而为其添加特定的附加语义,之后通过XDoclet工具对代码中JavaDoc Tag进行分析,自动生成与代码对应的配置文件(http://xdoclet.sourceforge.net/)。XDoclet提供了对Hibernate的支持,这样我们可以直接由Java代码生成Hibernate映射文件。

 

Middlegen: 用来从数据库中已有的表结构中生成Hibernate映射文件。当前版本是2.1可以去http://boss.bekk.no/boss/middlegen下载。

 

 

Hibernate核心接口

Configuration

正如其名,Configuration 类负责管理Hibernate 的配置信息。Hibernate 运行时需要

获取一些底层实现的基本信息,其中几个关键属性包括:

1、数据库URL

2、数据库用户

3、数据库用户密码

4、数据库JDBC驱动类

1、  数据库dialect,用于对特定数据库提供支持,其中包含了针对特定数据库特性的实现,如Hibernate数据类型到特定数据库数据类型的映射等。

当然,还有指定Hibernate映射文件的位置。(*.hbm.xml)。

 

Hibernate配置有两种方法:

一、属性文件配置。默认文件名是hibernate.properties。调用代码:

    Configuration config = new Configuration();

二、XML文件配置。默认文件名是hibernate.cfg.xml

Configuration config = new Configuration().configure();

 

SessionFactory:应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它打算在多个应用线程间进行共享。通常情况下,整个应用只有唯一的一个会话工厂——例如在应用初始化时被创建。然而,如果你使用Hibernate访问多个数据库,你需要对每一个数据库使用一个会话工厂。

会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。它也保存了在一个工作单元中读入的数据并且可能在以后的工作单元中被重用(只有类和集合映射指定了使用这种二级缓存时才会如此)。

SessionFactory sessionFactory = config.buildSessionFactory();

 

Session(会话):该接口是Hibernate使用最多的接口。Session不是线程安全的,它代表与数据库之间的一次操作。Session通过SessionFactory打开,在所有的工作完成后,需要关闭:它的概念介于ConnectionTransaction之间。我们可以简单的认为它是已经装载对象的缓存或集合的一个独立工作单元。

我们有时也称Session为持久化管理器,因为它是与持久化有关的操作的接口。

Hibernate会话并不是线程安全的因此应该被设计为每次只能在一个线程中使用。Hibernate会话与Web层的HttpSession没有任何关系。

Session session = sessionFactory.openSession();

 

Transaction事务将应用代码从底层的事务实现中抽象出来——这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)——允许应用通过一组一致的API控制事务边界。这有助于保持Hibernate应用在不同类型的执行环境或容器中的可移植性。

Transaction trans = session.beginTransaction ();

 

Query: Query(查询)接口允许你在数据库上执行查询并控制查询如何执行。查询语句使用HQL或者本地数据库的SQL方言编写。

Query query = session.createQuery(“from User”);

 

Lifecycle:Lifecycle接口提供了一些回调方法,可以让持久化对象在saveload之后,或者在deleteupdate之前进行必要的初始化与清除步骤。

public interface Lifecycle {

        public boolean onSave(Session s) throws CallbackException;   (1)

        public boolean onUpdate(Session s) throws CallbackException; (2)

        public boolean onDelete(Session s) throws CallbackException; (3)

        public void onLoad(Session s, Serializable id);              (4)

}

(1) onSave - 在对象即将被save或者insert的时候回调

 (2) onUpdate - 在对象即将被update的时候回调(也就是对象被传递给Session.update()的时候)

 (3) onDelete - 在对象即将被delete(删除)的时候回调

 (4) onLoad - 在对象刚刚被load(装载)后的时候回调

Validatable: 该接口是合法性检查的回调。如果持久化类需要在保存其持久化状态前进行合法性检查,它可以实现下面的接口:

public interface Validatable {

        public void validate() throws ValidationFailure;

}

如果发现对象违反了某条规则,应该抛出一个ValidationFailure异常。在Validatable实例的validate()方法内部不应该改变它的状态。

Lifecycle接口的回调方法不同,validate()可能在任何时间被调用。应用程序不应该把validate()调用和商业功能联系起来。

Interceptor: Interceptor接口提供从session到你的应用程序的回调方法,让你的程序可以观察和在持久化对象保存/更改/删除或者装载的时候操作它的属性。一种可能的用途是用来监视统计信息。比如,下面的Interceptor会自动在一个Auditable创建的时候设置其createTimestamp,并且当它被更改的时候,设置其lastUpdateTimestamp属性。

 

UserType: 开发者创建属于他们自己的值类型也是很容易的。比如说,你可能希望持久化java.lang.BigInteger类型的属性,持久化成为VARCHAR字段。Hibernate没有内置这样一种类型。自定义类型能够映射一个属性(或集合元素)到不止一个数据库表字段。比如说,你可能有这样的Java属性:getName()/setName(),这是java.lang.String类型的,对应的持久化到三个字段:FIRST_NAME, INITIAL, SURNAME 要实现一个自定义类型,可以实现net.sf.hibernate.UserTypenet.sf.hibernate.CompositeUserType中的任一个,并且使用类型的Java全限定类名来声明属性。请查看net.sf.hibernate.test.DoubleStringType这个例子,看看它是怎么做的。

<property name="twoStrings" type="net.sf.hibernate.test.DoubleStringType">

    <column name="first_string"/>

    <column name="second_string"/>

</property>

注意使用<column>标签来把一个属性映射到多个字段的做法。

 

用户的例子

设计:用户,id name

映射:User.java User.hbm.xml

一、安装

二、持久化类(Persistent Class

持久化类不需要实现什么特别的接口,也不需要从一个特别的持久化根类继承下来。Hibernate也不需要使用任何编译期处理,比如字节码增强操作,它独立的使用Java反射机制和运行时类增强(通过CGLIB)。所以,在Hibernate中,POJO的类不需要任何前提条件,我们就可以把它映射成为数据库表。

 

持久化类必须遵循的原则:

1、  为类的持久化类字段申明访问方法(Get/set)。HibernateJavaBeans风格的属性实行持久化。

2、  实现一个默认的构造方法(constructor)。这样的话Hibernate就可以使用Constructor.newInstance()来实例化它们。

3、  如果是集合类型的属性,它的类型必须定义为集合的接口。例如:ListSet

4、  提供一个标识属性(identifier property)。如果没有该属性,一些功能不起作用,比如:级联更新(Cascaded updatesSession.saveOrUpdate()

 

三、hibernate映射文件

 

 

四、应用:TestUser.java

之后做个总结,特别是CRUD操作。