博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hibernate 入门
阅读量:5824 次
发布时间:2019-06-18

本文共 6314 字,大约阅读时间需要 21 分钟。

hot3.png

一、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 ThreadLocal
sessionThreadLocal = 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种状态转变关系

转载于:https://my.oschina.net/u/2277088/blog/812679

你可能感兴趣的文章
logging模块学习:basicConfig配置文件
查看>>
Golang 使用 Beego 与 Mgo 开发的示例程序
查看>>
ntpdate时间同步
查看>>
+++++++子域授权与编译安装(一)
查看>>
asp.net怎样在URL中使用中文、空格、特殊字符
查看>>
路由器发布服务器
查看>>
实现跨交换机VLAN间的通信
查看>>
jquery中的data-icon和data-role
查看>>
python例子
查看>>
环境变量(总结)
查看>>
ios之UILabel
查看>>
Java基础之String,StringBuilder,StringBuffer
查看>>
1月9日学习内容整理:爬虫基本原理
查看>>
安卓中数据库的搭建与使用
查看>>
AT3908 Two Integers
查看>>
渐变色文字
查看>>
C++ 0X 新特性实例(比较常用的) (转)
查看>>
node生成自定义命令(yargs/commander)
查看>>
各种非算法模板
查看>>
node-express项目的搭建并通过mongoose操作MongoDB实现增删改查分页排序(四)
查看>>