Hibernate4 : 持久化你的第一个类
由于目前我在学校的一个实验室跟老师学习Java EE开发,老师用的是Seam框架接活做项目,所以这一系列的文章将会向Seam方向写。。路线大致应该是 : JSP --> Servlet --> Hibernate --> JSF --> EJB3 --> Seam
在开始之前,去www.hibernate.org下载 hibernate4.final.zip ,并将所有依赖的jar文件放到classpath下
一、Hibernate简介
持久化,是指将内存中的数据保存到可以永久存储数据的高设备中,如硬盘。
Hibernate是一个开放源代码的对象关系映射(ORM)框架,它对JDBC进行了轻量级的封闭,使得程序员能从繁杂的JDBC操作中彻底解放出来。Hibernate使用hibernate.cfg.xml完成数据库的配置,使用 *.hbm.xml文件定义从对象到数据库的映射规则。
数据库的配置 : hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- MySql JDBC驱动类 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- MySql DB用户密码 --> <property name="hibernate.connection.password">0000</property> <!-- MySql 连接URL --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <!-- MySql DB用户名 --> <property name="hibernate.connection.username">root</property> <!-- MySql JDBC方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 在控制台打印自动生成的SQL语句 --> <property name="hibernate.show_sql">true</property> <!-- 实例Bean映射定义文件 --> <mapping resource="dev/entity/UserBean.hbm.xml"/> </session-factory> </hibernate-configuration>
<mapping resource="dev/entity/UserBean.hbm.xml"/>是指定映射规则文件的路径。UserBean.hbm.xml定义了从UserBean这个类到关系数据库的映射规则。该文件应该放在与UserBean.class 同级的目录下。UserBean这个实例bean定义如下:
package dev.entity; public class UserBean { private int id; //用做主键 private String name; private String pwd; //省略get和set方法 }
我们要做的就是将UserBean这个类存储到数据库的一张名叫USERBEAN的表中。UserBean的每个属性都对应着数据表中的一个字段。首先创建USERBREAN数据表:
create table USERBEAN ( ID int key auto_increment, NAME varchar(40), PWD varchar(40) );
注意,主键 ID字段必须设置成auto_increment,即自增类型。下面通过UserBean.hbm.xml来定义从类到数据库的映射规则。
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated Jun 29, 2013 2:13:53 PM by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="dev.entity.UserBean" table="USERBEAN"> <id name="id" type="int"> <column name="ID" /> <generator class="native" /> </id> <property name="name" type="java.lang.String" length="40"> <column name="NAME" /> </property> <property name="pwd" type="java.lang.String" length="40"> <column name="PWD" /> </property> </class> </hibernate-mapping>
关于这些xml文件的说明,可以查看官方文档。上面的xml应该很容易理解,如table属性指的就是表名,id元素定义了主键等等。这里不再说明
好了,一切准备就绪,下面就开始持久化我们的第一个类吧!
二、使用Hibernate持久化类的流程
构造Configuration对象 --> 构造ServiceRegistry对象 --> 得到SessionFactory对象 -->使用SessionFactory得到Session对象。
得到Session对象后,首先要调用beginTransaction()方法来打开一个事务,然后调用save()方法将UserBean的实例做为参数传递进去,再调用Transaction的commit()方法提交事务,这时候UserBean对象才会被保存到数据库中。如果调用完save()方法后没有调用commit(),则不会进行任何的保存工作,只有当事务关闭或者调用了flush方法后才会真正地将对象持久化。
package dev; import java.rmi.registry.Registry; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.ServiceRegistryBuilder; import dev.entity.*; public class Main { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Configuration cfg = new Configuration().configure(); //加载配置文件 ServiceRegistry registry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()) .buildServiceRegistry(); //在得到SessionFactory之前要先进行注册,Hibernate4新特性 SessionFactory factory = cfg.buildSessionFactory(registry); Session session = factory.openSession(); //开启一个session //填充实例bean UserBean user = new UserBean(); user.setId(1); user.setName("bruce"); user.setPwd("1234567"); session.beginTransaction(); //开始一个事务 session.save(user); //保存实例对象 session.getTransaction().commit(); //提交事务,user会被持久化 session.close(); } }
注意,如果使用的是Hibernate3或之前的版本,则不需要注册这一步,即main方法中第二行代码可以省略,cfg.buildSessionFactory()方法不需要参数。
运行程序,持久化完成。