一、首先介绍一下jar包
在这里面进行对hibernate的需要的jar的介绍
1.hibernate3.jar Hibernate的核心类库
2.antlr-2.7.6.jar 语言转换工具,Hibernate利用它来实现HQL到SQL的转换
antlr:Another Tool for Language Recognition 另一个语言识别工具 ,总之就是关于语言,对语言的操作的
3.commons-collections-3.1.jar collections Apache的工具集,用来增强Java对集合的处理能力
collection类是一个最基本的集合接口,大家熟知的List和Set都是都是它的子接口
4.dom4j-1.6.1.jar 一个JavaXML的API,类似于JDOM,用来读写XML
JDOM是一个开源项目,它是基于树形结构的,利用纯Java技术对XML文档进行实现解析、生成、序列化以及多种操作,简单来说就是实现对xml的读、写、操作
5.javassist-3.12.0.GA.jar 一个开源的分析、编译和创建字节码的类库
6.jta-1.1.jar 标准的Java事务(跨数据库)处理接口
jta:即Java Transaction API
7.hibernate-jpa-2.0-api-1.0.1.Final.jar JPA接口开发包
jap:Java Persistence API Java持久层API
/*关于日志的jar包*/
8、slf4j-api-1.6.1.jar 只是一个接口,用于整合log4j
log4j-1.2.17.jar Loh4j日志文件核心JAR
slf4j-log4j12-1.7.12.jar Hibernate使用的一个日志系统
9、/*hibernate自带的日志jar包*/
jboss-logging-3.1.0.GA.jar
以上有两种日志的jar包,我认为hibernate默认使用的是自带的日志,当然如果想用log4j的日志可以试着这样做:首先添加log4j.properties文件,还有相关jar包,然后就是一下两种办法可以实现
1.设置系统属性:jboss.logging.provider=slf4j
2.就是将hibernate的jboss-logging.xxxjar包换成3.2版本以上的,目前hibernate4.3.10自带的jboss-logging还是3.1的
我认为hibernate日志加载顺序应该是:
1.JBoss的自己的日志实现
2.log4j的2.x的
3.log4j的1.x的
4.SLF4J -
5.java.util.logging中
二、hibernate执行流程
(1)初始化Hibernate,构建Configuration实例,这一步就是将hibernate核心配置文件和映射文件加载到Configuration对象中
(2)创建SessionFactory实例。通过Configuration对象读取到的配置文件信息创建SessionFactory,并将Configuration对象中所有的配置文件信息存入到 SessionFactory内存中。
(3)创建Session实例,建立 数据库连接。Session是通过SessionFactory打开的,创建一个Session相当于建立一个新的数据库连接
(4)创建Transaction实例,开启一个事务,Transaction用于事务管理,一个Transaction对象对应的事务可以包含多个操作,在Hibernate中执行增删改操作时,必须创建Transaction对象。事务默认是关闭的,如果进行查找操作不需要开启事务
(5)利用Session接口通过的各种方法进行持久化操作
(6)提交事务。对实体对象持久化操作之后,必须提交操作
(7)关不Session,断开与数据库的连接
下面,我们用一个实例来描述上方的步骤
(1)Configuration configuration = new Configuration().configure();
(2)SessionFactory sessionFactory = configuration.buildSessionFactory();
(3)Session session= sessionFactory.openSession();
(4)Transaction transaction = seession.beginTransaction();
(5)
User user = new User();
user.setUsername("张三");
user.setPassword("123456");
session.save(user);
(6)transaction.commit();
(7)session.close();
sessionFactory.close();
上面的这个保存操作每一步和上面的Hibernate执行流程是一一对应的
三、简单说一下,懒加载(lazy属性)
1、 在<many-to-many>中lazy有三种取值:false(立即加载)、proxy(使用延迟加载)、no-proxy(无代理延迟加载)。默认是proxy
2、 <class> 中的lazy有两种取值 false(立即加载)、true(延迟加载)。 默认是true
3、<set> 中的lazy有三种方式false(立即加载)、true(延迟加载)、extra(增强延迟加载)。默认是true
lazy作用:关联延迟加载,记住是关联、关联、关联,重要的话说三遍,为什么是很重要这个等下再说,因为和下面的内容有联系
四、简单说一下get()和load()方法
作用都是相同的,就是通过传入两个参数
参数类型都是相同的,相信稍微有点基础的朋友都会知道怎么传参
不同点:
当想取得的的数据在数据库中不存在时,get会返回null,load会返回一个异常
然后就是数据存在时,load是什么时候用什么发出请求,get是不论是否有需要都要发送请求
五、将延迟加载和get()、load()方法结合起来
false | true | |
get() | 立即查询,并且是一次性加载完,包括关联对象 | 立即查询,用什么加载什么,如果用不到关联对象,就不会执行查询关联度向的操作 |
load() | 什么时候用什么时候查询,并且是一次性加载完,包括关联对象 | 什么时候用什么时候查询,用什么加载什么,如果用不到关联对象,就不会执行查询关联度向的操作 |