一、Hibernate包。
1、目录结构。
- documentation:存放Hibernate相关文档,包括参考文档和API文档。
- lib:存放Hibernate编译和运行所依赖的JAR包。其中required子目录下包含了运行Hibernate项目必备的JAR包。
- project:存放了Hibernate各种相关的源代码。
2、Hibernate必须的JAR包介绍。
JAR包名 | 说明 |
hibernate-core-4.3.11.Final.jar | 核心类库 |
antlr-2.7.7.jar | 语言转换工具,Hibernate利用它实现了HQL到SQL的转换 |
dom4j-1.6.1.jar | 是一个Java的XML API,类似于JDOM,用来读写XML文件 |
javassist-3.18.1-GA.jar | 一个开源的分析、编辑和创建Java字节码的类库 |
hibernate-commons-annotations-4.0.5.Final.jar | 常见的反射代码,用于支持注解处理 |
hibernate-jpa-2.1-api-1.0.0.Final.jar | 对JPA(Java持久化API)规范的支持 |
jboss-logging-3.1.0.GA.jar | JBoss的日志框架 |
jboss-transaction-api_1.1_spec-1.0.0.Final.jar | 指定食物、事务处理和分布式事务处理系统之间的标准,Java接口,包括资源管理,应用服务和实务应用程序 |
jboss-logging-annotations-1.2.0.Beta1.jar | 使用javax.persistence下的Annotation可以不依赖Hibernate的JAR包,这样的?可以切换到其他的ORM框架 |
jandex-1.1.0.Final.jar | 用来索引annotation的 |
3、Hibernate的执行流程
configuration -> sessionfactory -> session ->(transaction可省) -> do job
二、Hibernate_Demo
使用MySQL数据库,创建hibernate_demo库BASE_ENTITY表,结构如下
字段名 | 类型 | 说明 |
ID | int | 主键,自增 |
CREATE_TIME | datetime | 数据创建时间 |
步骤如下:
1、创建WEB项目,名为Hibernate_Demo。
2、将Hibernate必须的包放入lib目录。
3、将MySQl数据库驱动放入lib目录。
4、创建实体类。
package com.hibernate.entity;import java.util.Date;public class BaseEntity{ private Integer id; private Date createTime; public BaseEntity(){ } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Date getCreateTime() { return createTime; } public void setCreateTime(Date createTime) { this.createTime = createTime; }}
5、编写映射文件。
实体BaseEntity目前还不具备持久化操作的能力,需要告知Hibernate框架将尸体类映射到数据库中的哪个表以及属性对应到数据库中哪个字段。
其中Hibernate提供了日常主键生成策略。
- increment:对象表示符由Hibernate以递增方式生成,如果有多个应用实例向同一张表插入数据时,则会出现重复的主键,应谨慎使用。
- identity对象表示服由底层数据库的自增主键生成机制产生,要求底层数据库支持自增字段类型,如MySQL的auto_increment类型和SQL Service的identity类型主键。
- sequence:对象表示服由底层数据库的序列生成机制产生,要求底层数据库支持序列,如Oracle数据库的序列。
- hilo:对象表示服由Hibernate按照高/低位算法生成。
- native:根据底层数据库对自动生成表示服的支持能力,选择identity、sequence活着hilo。适合于跨数据库平台的开发。
- assigned:对象表示服由应用程序产生,如果不置顶<generator>节点,则默认使用该生成策略。
6、编写Hibernate配置文件
在src目录下创建hibernate.cfg.xm,在里面添加Hibernate链接数据库的相关信息。
true hibernate_demo jdbc:mysql://localhost:3306/hibernate_demo root 123456 com.mysql.jdbc.Driver org.hibernate.dialect.MySQLDialect
7、编写会化工厂类HibernateSessionFactory
package com.hibernate.dao;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;/** * Hibernate Session工厂类 * @author lixiang * */public class HibernateSessionFactory { //指定Hibernate配置文件路径 private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml"; //创建ThreadLocal对象 private static final ThreadLocalsessionThreadLocal = new ThreadLocal (); //创建Configuration对象 private static Configuration configuration = new Configuration(); //定义SessionFactory对象 private static SessionFactory sessionFactory; //定义configFile属性并赋值 private static String configFile = CONFIG_FILE_LOCATION; static{ try{ //读取配置文件hibernate.cfg.xml configuration.configure(); //生成一个注册即对象 ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()).buildServiceRegistry(); //使用注册即对象serviceRegistry创建sessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); }catch(HibernateException e){ e.printStackTrace(); } } /** * 创建午餐的HibernateSessionFactory构造方法 */ private HibernateSessionFactory(){} /** * 获得SessionFactory对象 * @return */ public static SessionFactory getSessionFactory(){ return sessionFactory; } /** * 重建SessionFactory */ public static void rebuildSessionFactory(){ synchronized(sessionFactory){ try{ configuration.configure(configFile); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()).buildServiceRegistry(); //使用注册机对象serviceRegistry创建sessionFactory sessionFactory = configuration.buildSessionFactory(serviceRegistry); }catch(HibernateException e){ e.printStackTrace(); } } } /** * 获得Session对象 * @return */ public static Session getSession(){ //获得ThreadLocal对象管理的Session对象 Session session = sessionThreadLocal.get(); try{ //判断Session对象是否已经存在或是打开 if(session == null || !session.isOpen()){ //如果Session对象喂空或未打开,再判断sessionFactory对象是否为空 if(sessionFactory == null){ //如果sessionFactory为空,则创建SessionFactory rebuildSessionFactory(); } //如果sessionFactory不为空,则打开Session session = (sessionFactory != null)?sessionFactory.openSession() : null; sessionThreadLocal.set(session); } }catch(HibernateException e){ e.printStackTrace(); } return session; } /** * 关闭Session对象 */ public static void clossSession(){ Session session = sessionThreadLocal.get(); sessionThreadLocal.set(null); try{ if(session!=null && session.isOpen()){ session.close(); } }catch(HibernateException e){ e.printStackTrace(); } } //configFile属性的set方法 public static void setConfigFile(String configFile){ HibernateSessionFactory.configFile = configFile; sessionFactory = null; } //configuration属性的get方法 public static Configuration getConfiguration(){ return configuration; }}
8、编写测试类
package com.hibernate.dao;import java.util.Date;import org.hibernate.Session;import org.hibernate.Transaction;import com.hibernate.entity.BaseEntity;public class BaseDao { public static void main(String[] args){ new BaseDao().addObject(); } private void addObject(){ //创建实体类(瞬态对象) BaseEntity object = new BaseEntity(); object.setCreateTime(new Date()); //获得Session实例 Session session = HibernateSessionFactory.getSession(); Transaction tx = null; try{ //开始一个事务 tx = session.beginTransaction(); //调用save方法持久化object,之后object转变为持久状态 session.save(object); //提交事务,像数据库中插入一个新记录 tx.commit(); }catch(Exception e){ if(tx!=null){ tx.rollback(); } e.printStackTrace(); }finally{ HibernateSessionFactory.clossSession(); //此时,object处于托管状态 } }}
9、链接数据库查看数据是否写入成功。
三、Hibernate对象3种状态转变关系