Hibernate技术概述
在Java环境下,有多种对象关系映射方法,如实体Bean、OJB、JDO、JDBC等。Hibernate是一个开源的持久层框架,是一种新的O/R映射工具,它不仅提供了从Java类到数据表的映射,也提供了数据查询和恢复等机制。Hibernate非常简单易学,目前国内有很多同行已经或正在用Hibernate开发实施项目。Hibernate 提供了以下的功能:
- 多映射策略
- Transitive persistence
- 单对象与多表间映射
- 支持集合映射
- 多态关联
- 定制SQL查询
Hibernate的体系结构

图1-1 hibernate体系结构图
如图1-1所示Hibernate API提供了五大核心接口:
Configuration 接口
Configuration 接口的作用是对Hibernate 进行配置,以及对它进行启动。在Hibernate 的启动
过程中,Configuration 类的实例首先定位映射文档的位置,读取这些配置,然后创建一个
SessionFactory对象。


Transaction 接口
Transaction 接口是对实际事务实现的一个抽象,这些实现包括JDBC的事务、JTA 中的UserTransaction、甚至可以是CORBA 事务。之所以这样设计是能让开发者能够使用一个统一事务的操作界面,使得自己的项目可以在不同的环境和容器之间方便地移值。
Query 和Criteria接口
Query接口让你方便地对数据库及持久对象进行查询,它可以有两种表达方式:HQL语言或本
地数据库的SQL语句。Query经常被用来绑定查询参数、限制查询记录数量,并最终执行查询操作。Criteria接口与Query接口非常类似,它允许你创建并执行面向对象的标准化查询。
值得注意的是Query接口也是轻量级的,它不能在Session之外使用。
Callback 接口
当一些有用的事件发生时――例如持久对象的载入、存储、删除时,Callback 接口会通知
Hibernate去接收一个通知消息。一般而言,Callback接口在用户程序中并不是必须的,但你要在你的项目中创建审计日志时,你可能会用到它。
Hibernate的开发步骤
- 完成数据库通讯配置
- 完成O-R映射的配置
- 加载数据库通讯配置,创建Hibernate的会话
- 根据O-R映射实现持久化类
- 编写数据库访存代码
Hibernate的配置
配置数据源,建立Hibernate与数据库通讯
一个典型的hibernate.cfg.xml配置文件如下:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration
PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-2.0.
dtd">
<hibernate-configuration>
<!—- SessionFactory 配置 -->
<session-factory>
<!—- 数据库URL -->
<property name="hibernate.connection.url">
jdbc:mysql://localhost/sample
</property>
<!—- 数据库JDBC驱动 -->
<property name="hibernate.connection.driver_class">
org.gjt.mm.mysql.Driver
</property>
<!—- 数据库用户名 -->
<property name="hibernate.connection.username">
User
</property>
<!—- 数据库用户密码 -->
<property name="hibernate.connection.password">
Mypass
</property>
<!--dialect ,每个数据库都有其对应的Dialet以匹配其平台特性 -->
<property name="dialect">
net.sf.hibernate.dialect.MySQLDialect
</property>
<!—- 是否将运行期生成的SQL输出到日志以供调试 -->
<property name="hibernate.show_sql">
True
</property>
<!—- 是否使用数据库外连接 -->
<property name="hibernate.use_outer_join">
True
</property>
<!—- 事务管理类型,这里我们使用JDBC Transaction -->
<property name="hibernate.transaction.factory_class">
net.sf.hibernate.transaction.JDBCTransactionFactory
</property>
<!—映射文件配置,注意配置文件名必须包含其相对于根的全路径 -->
<mapping resource="net/xiaxin/xdoclet/TUser.hbm.xml"/>
<mapping resource="net/xiaxin/xdoclet/TGroup.hbm.xml"/>
</session-factory>
</hibernate-configuration>
一个典型的hibernate.properties配置文件如下:
hibernate.dialect net.sf.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class org.gjt.mm.mysql.Driver
hibernate.connection.driver_class com.mysql.jdbc.Driver
hibernate.connection.url jdbc:mysql:///sample
hibernate.connection.username user
hibernate.connection.password mypass
配置O-R映射,建立对象与关系的映射
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!--
Mapping file autogenerated by MyEclipse - Hibernate Tools
-->
<hibernate-mapping>
<class name="com.myaccp.db.Userinfo" table="userinfo" schema="dbo" catalog="test">
<id name="id" type="java.lang.Integer">
<column name="id" />
<generator class="assigned" />
</id>
<property name="loginName" type="java.lang.String">
<column name="loginName" length="20" not-null="true" />
</property>
<property name="pwd" type="java.lang.String">
<column name="pwd" length="20" not-null="true" />
</property>
<property name="trueName" type="java.lang.String">
<column name="trueName" length="20" not-null="true" />
</property>
</class>
</hibernate-mapping>
Eclipse下配置


Hibernate的数据访存代码
加载数据源配置,创建与数据库通讯的会话
Configuration cfg= new Configuration(). cfg.configure();
SessionFactory factory= cfg.buildSessionFactory();
Session session=factory.OpenSession();
Configuration cfg= new Configuration().cfg.configure(“myhibernate.cfg.xml”);
SessionFactory factory= cfg.buildSessionFactory();
Session session=factory.OpenSession();
数据更新
- 插入
- 更改
Userinfo user= new Userinfo(new Integer(1),"accp","1234","accp");
tx=session.beginTransaction();
session.saveOrUpdate (user);
tx.commit();
- 删除
Userinfo user= new Userinfo(new Integer(1),"accp","1234","accp");
tx=session.beginTransaction();
session.delete (user);
tx.commit();
数据查询
HQL查询
public List findbyHQL(String loginname,String password){
List userlist = null;
log.debug("Query Userinfo");
try {
String hql="from Userinfo user where user.loginName=? and user.pwd=?";
Query query=getSession().createQuery(hql);
query.setString(0, loginname);
query.setString(1, password);
userlist = query.list();
log.debug("Query Userinfo end ");
} catch (RuntimeException re) {
log.error("Query failed", re); throw re;
}
return userlist;}
Criteria 查询
public List findbyCriteria(){
List userlist = null;
log.debug("Criterion Userinfo");
try {
Criteria cri=(Criteria) getSession().createCriteria(Userinfo.class);
cri.add(Expression.eq("loginName", "accp"));
userlist= cri.list();
log.debug("Criterion Userinfo end ");
} catch (RuntimeException re) {
log.error("Criterion failed", re);
throw re;}
return userlist;}
附言:
hibernate的发布网站:http://www.hibernate.org.cn/
以上配置和代码在Eclipse5.0和hibernate3上测试