最近学习java 学到了Hibernate想把学习的痕迹做个纪录,当做是笔记也行
本学习过程是围绕一本书进行的《精通hibernate》 孙卫琴版
书的开头一些概念性东西,暂时不做纪录。后面有时间再整(呵呵)
直接从2.4开始
2.4 Hibernate API 简介
Hibernate API 接口可分为一下几类
1.提供数据库操作的 增删改查的接口(Session、Transaction、Query)
2.用户配置Hibernate的接口:Configuration
3.使应用程序拦截Hibernate内部发生的事件
(Interceptor、LoadEventListener 和 SaveEventListener接口等)
- 用于扩展Hibernate功能的接口
另外Hibernate并没有完全封装jdbc也就是说程序可以绕过hibernate而直接使用jdbc来操作数据库
2.4.1 Hibernate 的核心接口
所有的Hibernate应用中都会访问的 5 个核心接口
- Configuration 接口:配置Hibernate、根启动Hibernate、创建SessionFactory对象
- SessionFactory 接口:初始化Hibernate 充当数据存储源的代理,创建Session对象
- Session 接口:负责保存、更新、删除、加载和查询对象
- Transaction 接口:事务管理
- Query 和 Criteria 接口:执行数据库查询
Configuration 接口
Configuration 对象用于配置并且根启动Hibernate,Hibernate通过Configuration实例来获取对象-关系映射文件中的元数据以及动态配置Hibernate的属性然后创建SessinFactory实例
(这个元数据是啥意思网上查询了下有人这样说:Hibernate中有一个非常丰富的元数据模型,含有所有的实体和值类型数据的元数据 大概意思就是这个“ 玩意儿可以获取当前实体的某些配置和信息 这些信息参数不是一般的多哦”)SessionFactory 接口
一个SessionFactory实例对应一个数据存储源,应用从SessionFactory中获取Sessin实例。SessionFactory有一下特点:
- 它是线程安全的(好高端),意思就是说 它的同一个实例可以被应用的多个线程共享。
- 它是重量级的,这意味着不能随意创建或销毁它的实例,如果应用只访问一个数据库,只需要创建一个SessinFactory实例,在应用初始化的时候创建该实例。如果应用同时访问多个数据库,则需要为每个数据库创建一个单独的SessionFactory实例。
之所以说SessinFactory 是重量级的,是应为它需要一个很大的缓存,用来存放预定义的SQL语句及映射元数据等。用户还可以问SessionFactory配置一个缓存插件,这个缓存被称为Hibernate的二级缓存,该缓存用来存放被工作单元度过的数据将来其他工作单元可能会 重用这些数据。因此这个缓存中的数据能被所有工作单元共享。一个工作单元通常对应一个数据库事物
-
Session 接口
上面已经说了Session 是从SessionFactory实例中获取来的,那么Sessin是干什么的呢,Session接口是Hibernate应用最广泛的接口,(好像是真的,之前自己做示例的时候确实用的多)。Session也被称为持久化管理器,它提供了和持久化相关的操作,保存、更新、删除、加载和查询对象。
接下来说下Sessin的特点:
- Session不是线程安全的,因此设计软件架构时,应该避免多个线程共享同一个Session实例。(什么鬼!管它呢,记住就好,联想SessionFactory是线程安全的,可共享)。
- Session实例是轻量级的,所谓轻量级,是指它的创建和销毁不需要消耗太多的资源。这意味着程序中可以经常创建和销毁Sessin对象(突然想到之前对SessionFactory频繁做close操作,以后的注意了),如为每个客户请求分配单独的Session实例,或者为每个工作单元分配单独的Sessin实例。
Sessin有一个缓存,被称为Hibernate的一级缓存,它存放被当前工作单元加载的对象。每个Sessin都有自己的缓存,这个Session实例的缓存只能被当前工作单元访问。
-
Transaction 接口
Transaction 接口是Hibernate的数据库事务接口,它对底层的事务接口做了封装,底层事务接口包括:
- JDBC API
- JTA (Java Transaction API )
- CORBA ( Common Object Requet Broker Architecture) API
Hibernate 应用可通过一致的Transaction 接口来声明事物边界这有助于应用在不同环境中移植。
-
Query 和 Criteria 接口
Query和Criteria 接口是Hibernate的查询接口,用于向数据库查询对象,以及控制执行查询的过程。Query 实例包装了一个HQL (Hibernate Query Language)查询语句,HQL和SQL查询语句有些相似,但HQL是面向对象的,它引用类名及类的属性名,而不是表名和表字段。Criteria接口完全封装了基于字符串形式的查询语句,比Query更加面向对象,Criteria接口擅长于执行动态查询。
2.4.2 事件处理接口
本小结内容比较少,主要是提点一下。详细还得到后面说。
当程序通过 Hibernate来加载、保存、更新或者删除对象时,会触发Hibernate的拦截器及事件监听器做出响应的处理。
(我理解为,当我们对数据或者对象做操作的同时,可以做做其他事儿,而谁来告诉我呢,那么就是本小结所说的时间处理接口啦)
事件及事件监听接口:在Hibernate API 针对没没一种事件都有相应的时间监听器,如加载对象时触发org.hibernate.event.LoadEvent事件、该事件由org.hibernate.event.LoadEventListener监听处理。等等
org.hibernate.Interceptor 接口:应用程序可以实现Interceptor接口的类,Interceptor实现类负责响应持久化类的实例被加载、保存、更新或删除的事件。
(9.2章节会详细说明 Interceptor接口)
2.4.3 Hibernate 映射类型接口
org.hibernate.type.Type接口表示Hibernate映射类型,用于把域对象映射为数据库的关系数据。Hibernate 为Type接口提供了各种实现类。它们代表具体的HIbernate映射类型,例如:
- PrimitiveType 类:映射Java基本类型包括了
- ByteType
- ShortType
- IntegerType
- LongType
- FloatType
- DoubleType
- CharacterType
- BooleanType
- DateType:映射java日期类型。
- BinaryType: 映射Byte[]类型
该节内容还是要掌握的,有用的着的地方。比如传参数的时候类型怎么弄该怎么绑定都是有讲究滴。具体我们到后面的实战演练的时候在用。
Hibernate 还允许用户以实现UserType和CompositeUserType接口的方式,定义客户化映射类型,详细后面介绍。
本篇文章就到这儿了,下一篇文章将会创建 一个Hibernate应用。
http://www.jianshu.com/p/548c9706433f