Hibernate是一个开放源代码的对象关系映射框架它对JDBC进行了非常轻量级的对象封装使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库Hibernate可以应用在任何使用JDBC的场合既可以在Java的客户端程序使用也可以在Servlet/JSP的Web应用中使用最具革命意义的是Hibernate可以在应用EJB的JEE架构中取代CMP完成数据持久化的重任
Hibernate的核心接口一共有个分别为SessionSessionFactoryTransactionQuery和Configuration这个核心接口在任何开发中都会用到通过这些接口不仅可以对持久化对象进行存取还能够进行事务控制下面对这五的核心接口分别加以介绍
·Session接口Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流包含了很多常见的SQL语句)但需要注意的是Session对象是非线程安全的同时Hibernate的session不同于JSP应用中的HttpSession这里当使用session这个术语时其实指的是Hibernate中的session而以后会将HttpSesion对象称为用户session
·SessionFactory接口SessionFactroy接口负责初始化Hibernate它充当数据存储源的代理并负责创建Session对象这里用到了工厂模式需要注意的是SessionFactory并不是轻量级的因为一般情况下一个项目通常只需要一个SessionFactory就够当需要操作多个数据库时可以为每个数据库指定一个SessionFactory
·Configuration接口Configuration接口负责配置并启动Hibernate创建SessionFactory对象在Hibernate的启动的过程中Configuration类的实例首先定位映射文档位置读取配置然后创建SessionFac
·Transaction接口Transaction接口负责事务相关的操作它是可选的开发人员也可以设计编写自己的底层事务处理代码
·Query和Criteria接口Query和Criteria接口负责执行各种数据库查询它可以使用HQL语言或SQL语句两种表达方式
Hibernate主键介绍
Assigned
Assigned方式由程序生成主键值并且要在save()之前指定否则会抛出异常特点主键的生成值完全由用户决定与底层数据库无关用户需要维护主键值在调用sessionsave()之前要指定主键值
Hilo
Hilo使用高低位算法生成主键高低位算法使用一个高位值和一个低位值然后把算法得到的两个值拼接起来作为数据库中的唯一主键Hilo方式需要额外的数据库表和字段提供高位值来源默认请况下使用的表是hibernate_unique_key默认字段叫作next_hinext_hi必须有一条记录否则会出现错误
特点需要额外的数据库表的支持能保证同一个数据库中主键的唯一性但不能保证多个数据库之间主键的唯一性Hilo主键生成方式由Hibernate 维护所以Hilo方式与底层数据库无关但不应该手动修改hi/lo算法使用的表的值否则会引起主键重复的异常
Increment
Increment方式对主键值采取自动增长的方式生成新的主键值但要求底层数据库的支持Sequence如OracleDB等需要在映射文件xxxhbmxml中加入Increment标志符的设置
特点由Hibernate本身维护适用于所有的数据库不适合多进程并发更新数据库适合单一进程访问数据库不能用于群集环境
Identity
Identity当时根据底层数据库来支持自动增长不同的数据库用不同的主键增长方式
特点与底层数据库有关要求数据库支持Identity如MySQl中是auto_increment SQL Server 中是Identity支持的数据库有MySqlSQL ServerDBSybase和HypersonicSQL Identity无需Hibernate和用户的干涉使用较为方便但不便于在不同的数据库之间移植程序
Sequence
Sequence需要底层数据库支持Sequence方式例如Oracle数据库等特点需要底层数据库的支持序列支持序列的数据库有DBPostgreSqlQracleSAPDb等在不同数据库之间移植程序特别从支持序列的数据库移植到不支持序列的数据库需要修改配置文件
Native
Native主键生成方式会根据不同的底层数据库自动选择IdentitySequenceHilo主键生成方式特点根据不同的底层数据库采用不同的主键生成方式由于Hibernate会根据底层数据库采用不同的映射方式因此便于程序移植项目中如果用到多个数据库时可以使用这种方式
UUID
UUID使用位UUID算法生成主键能够保证网络环境下的主键唯一性也就能够保证在不同数据库及不同服务器下主键的唯一性
特点能够保证数据库中的主键唯一性生成的主键占用比较多的存贮空间
Foreign GUID
Foreign用于一对一关系中GUID主键生成方式使用了一种特殊算法保证生成主键的唯一性支持SQL Server和MySQL
Hibernate源码中几个包的作用简要介绍
netsfhibernate*
该包的类基本上都是接口类和异常类
netsfhibernatecache*
JCS的实现类
netsfhibernatecfg*
配置文件读取类
llection*
Hibernate集合接口实现类例如ListSetBag等等Hibernate之所以要自行编写集合接口实现类是为了支持lazy loading
nnection*
几个数据库连接池的Provider
netsfhibernatedialect*
支持多种数据库特性每个Dialect实现类代表一种数据库描述了该数据库支持的数据类型和其它特点例如是否有AutoIncrement是否有Sequence是否有分页sql等等
netsfhibernateeg*
Hibernate文档中用到的例子
netsfhibernateengine*
这个包的类作用比较散
netsfhibernateexpression*
HQL支持的表达式
netsfhibernatehq*
HQL实现
netsfhibernateid*
ID生成器
netsfhibernateimpl*
最核心的包一些重要接口的实现类如果SessionSessionFactoryQuery等
netsfhibernatejca*
JCA支持把Session包装为支持JCA的接口实现类
netsfhibernatejmx*
我不懂JMX只知道JMX是用来编写App Server的管理程序的大概是JMX部分接口的实现使得App Server可以通过JMX接口管理Hibernate
netsfhibernateloader*
也是很核心的包主要是生成sql语句的
netsfhibernatelob*
Blob和Clob支持
netsfhibernatemapping*
hbm文件的属性实现
tadata*
PO的Meta实现
netsfhibernateodmg*
ODMG是一个ORM标准这个包是ODMG标准的实现类
netsfhibernatepersister*
核心包实现持久对象和表之间的映射
netsfhibernateproxy*
Proxy和Lazy Loading支持
netsfhibernateps*
该包是PreparedStatment Cache
netsfhibernatesql*
生成JDBC sql语句的包
netsfhibernatetest*
测试类你可以用junit来测试Hibernate
netsfhibernatetoolhbmddl*
用hbm配置文件生成DDL
netsfhibernatetransaction*
Hibernate Transaction实现类
netsfhibernatetype*
Hibernate中定义的持久对象的属性的数据类型
netsfhibernateutil*
一些工具类作用比较散
netsfhibernatexml*
XML数据绑定