一、认识Hibernate
Hibernate的五个核心接口:
1. Configuration接口:配置并启动hibernate,创建SessionFactory对象
2. SessionFactory接口:初始化hibernate,充当数据存储源的代理,创建Session对象
特点:
(1) 它是线程安全的,即它的一个实例可以被应用的多个线程共享
(2) 它是重量级的,即它的实例不能随意的创建和销毁,如只访问一个数据库,只需要创建一个SessionFactory实例,在初始化应用的时候创建该实例,如果应用同时访问多个数据库,就需要给每个数据库单独创建一个SessionFactory实例
(3) 用户可以给SessionFactory配置一个缓存插件,这个缓存插件被称为hibernate的二级缓存,存放工作单元访问过的数据用于其他工作单元的访问,即二级缓存的数据所有的工作单元可共享,一个工作单元通常对应一个数据库事务
3. Session接口:负责保存、更新、删除、加载以及查询对象
特点:
(1) 不是线程安全的,所以在设计时要注意避免多个线程共享同一个Session
(2) 它是轻量级的,及创建和销毁实例时占用资源少,所以在应用可以经常的创建和销毁Session实例,如给每个用户请求创建一个Session、或者每个工作单元创建一个Session
(3) Session有一个缓存,及hibernate的一级缓存,存放当前工作单元访问的数据,每个Session实例都有自己的缓存,而只有当前工作单元能访问一级缓存中的数据
(4) Session接口的find()方法具有查询功能,但只能执行一些简单的HQL查询语句的快捷方法
4. Transaction:管理事务,对底层的事务接口(JTA、JDBC API、CORBA API)做了封装
5. Query、Criteria接口:负责执行数据库查询以及控制查询的过程
(1) Query:它包装了一种HQL(Hibernate Query Language)查询语句,HQL查询语句和SQL查询语句相似,但是HQL语句是面向对象的,它引用的是类名以及类的属性名而不是引用表名和字段名
(2) Criteria:它完全封装了基于字符串形式的查询语句,比Query更加的面向对象,擅长执行动态查询
Hibernate的其他接口:
1. 回调接口:当对象发生特定的事件(加载、保存、更新、删除等),Hibernate通过回调接口来响应事件,回调接口分为两类:
(1) LifeCycle和Validatable接口,需要由持久化类来实现接口,LifeCycle使持久化类能响应删除、保存加载的事件,Validatable使持久化类能在保存之前进行数据验证;这种方式使得Hibernate API渗透到持久化类中,不利于移植,尽量少用
(2) Intercepter接口,程序可以定义专门的类来实现Intercepter接口
2. 映射类型接口:
Type接口表示Hibernate的映射类型,用于把域对象映射为数据库的关系数据,Hibernate为Type接口提供了各种实现,应用程序不必自己创建Type实例,应该通过Hibernate类访问它的静态Type实例,如:Hibernate.STRING访问StringType实例,在通过Query动态绑定查询参数时,可以用这种方式设定被绑定参数的映射类型:
Query query = Session.createQuery(“from User u where c.name = :name”);
//未name参数设定值为:”TOM”,并且指定name的类型为Hibernate.STRING类型
query.setParameter(“name”,”TOM”,Hibernate.STRING);
Hibernate还允许用户通过实现UserType和CompositeUserType接口自定义映射类型
3. 可扩展的接口:
当Hibernate内置的策略不能满足用户需求时,Hibernate允许用户以实现接口或扩展特定类的方式自定义策略,Hibernate扩展接口如下:
(1) 定制主键生成策略:IdentifierGenerator接口
(2) 定制本地SQL方言:Dialect接口
(3) 定制缓存机制:Cache和CacheProvider接口
(4) 定制JDBC连接管理:ConnectionProvider接口
(5) 定制事务管理:TransactionFactory、Transaction、TransactionManagerLookup接口
(6) 定制ORM策略:ClassPersister接口及它的子接口
(7) 定制属性访问策略:PropertyAccessor接口
(8) 创建代理:ProxyFactory接口
(9) 定制映射类型:UserType、CompositeUserType接口
以上的接口(除了UserType、CompositeUserType外)都由Hibernate提供了至少一种实现,一般就使用Hibernate的内置实现,在不满足需求的时根据内置实现代码自己实现
二、入门Hibernate
1. Hibernate没有规定持久化类必须实现java.io.Serializable接口,但是在采用分布式接口的JAVA应用中,当Java对象在不同的进程节点之间传输时;或者在JAVA Web应用中,希望对HttpSerssion中的对象进行持久化时;这两种情况的Java对象必须实现接口
2. 持久化类有一个ID属性,用来唯一表示每个持久化类的对象,在面向对象术语中,这个ID被称为对象标识符OID(Object Identifier),通常用整数表示(也可其他数据类型);当A.getId().equals(B.getId())结果为true时:说明AB为同一个对象,并且表示数据库同一条记录
3. Hibernate要求持久化类必须有一个不带参数的默认构造方法,在程序运行时,Hibernate通过Java反射机制调用java.lang.reflect.Constructor.newInstance()方法来构造持久化类的实例,如果这个持久化类使用了延迟加载策略,为了使Hibernate在运行时能为持久化类创建动态代理,持久化类的默认构造方法的访问修饰符必须时public或者protected,不能是默认的或者private的
4. hbm2java和hbm2ddl工具
(1)转换工具有:
hbm2java:根据映射文件自动生成java源文件,此工具位于Hibernate扩展包中,需要到www.hibernate.org网站上下载Hibernate的扩展包,文件形式:hibernate-extensions-2.x.y.zip,解压后复制hibernate-tools.jar文件以及lib子目录下所有的jar文件到项目中
hbm2ddl:根据映射文件自动生成数据库Schema
XDoclet:根据带有XDoclet标记的Java源文件生成映射文件
Middlegen:根据数据库Schema自动生成映射文件