概述
目录
Configuration类
SessionFactory接口
Session接口
Transaction接口
Configuration类
Configuration类主要用来读取配置文件,启动Hibernate,并负责管理Hibernate的配置信息。一个应用程序只创建一个Configuration对象。
Configuration类的作用是对Hibernate进行配置,启动Hibernate并连接数据库系统。在启动Hibernate的过程中,ConFiguration实例首先确定Hibernate映射文件的位置,然后读取相关的配置,最后创建一个唯一的SessionFactory实例,这个唯一的SessionFactory实例负责进行所有的持久化操作。Configuration对象只存在于系统的初始化阶段。
在Hibernate启动过程中,Configuration类的实例首先找到默认的XML配置文件hibernate.cfg.xml,读取相关的配置信息,然后创建出一个SessionFactory对象。
调用Hibernate的API首先要创建Configuration实例,只有将Configuration实例化后,其它对象才能被创建。
Coniguration类管理的内容如下:
Hibernate运行时的底层信息,包括数据库的URL,用户名,密码,数据库方言等。
Hibernate映射文件。
SessionFactory接口
通常情况下,一个应用程序中只有一个SessionFactory实例,且SessionFactoey实例是不能改变的。SessionFactory的主要用来生成Session对象。
SessionFactory接口负责Hibernate的初始化。它作为数据存储源的代理,负责建立Session对象。具体来说,在Hibernate中SessionFactory实际上起到了一个缓冲区的作用,Hibernate自动生成SQL语句,映射数据以及某些可重复利用的数据都可放在这个缓冲区中。同时它还保存了对数据库配置的所有映射关系,维护了当前的二级数据缓存和Statement Pool。
一般情况下,一个项目只需要一个SessionFactory,但当项目中要操作多个数据库时,则必须为每个数据库指定一个SessionFactory。
SessionFactory的特点:
线程安全。
重量级,不能随意创建和销毁它的实例。
Configuration对象根据读取的配置文件建立SessionFactory实例后,任何对Configuration实例的改变都不会影响SessionFactory实例。一旦需要对Configuration的实例进行修改,就需要重新建立相应的SessionFactory实例。如果应用中需要访问数据库,就需要建立多个Configuration实例来创建多个SessionFactory实例。
Session接口
Session接口是Hibernate中使用最为广泛的接口,也是持久化操作的核心。
Session对象的生命周期以Transaction对象的事务开始和结束为边界。Session提供了一系列与持久化相关的操作,如读取,创建和删除相关实体对象的实例,这一系列的操作最终将被装换为对数据库中数据的增加,修改,查询和删除操作。因此,session也被称为持久化管理器。
Session的特点:
不是线程安全的
轻量级资源
有一个缓存,即Hibernate的第一级缓存,用于存放当前工作单元加载的对象
常用的Session操作方法
save()
将对象加入到缓存中,同时标识为Persistent状态。
根据映射文件中的配置信息生成实体对象的唯一标识符。
生成计划执行的INSERT语句。
实体对象的生命周期(Hibernate中的实体对象在整个应用中的存在状态):
瞬时态(Transient):利用new操作符实例化后的对象所处的状态即为瞬时态。这时它们还没有被存入任何数据库表中,因此一旦它们不再被其它对象引用时,它们的状态立即丢失,并且不能再被访问,只能等待进行垃圾回收。Hibernate不能对瞬时态对象提供回滚操作。
持久态(Persistent):持久态对象处于Hibernate框架管理的状态,也就是说该对象与Session实例是相关的,对持久态对象所做的任何操作都将被Hibernate持久化到数据库中。处于持久态的对象位于一个Session实例的缓存中,持久态对象总是和数据库中的记录相对应。Session对缓存做清理时,会依据持久态对象的属性的变化,来同步更新到数据库。
游离态(Detached):当处于持久态的对象不再与Session实例相关联时,该对象就变成了游离态。此时游离态对象的属性值发生变化,Hibernate不会再将变化同步到数据库中。
同一个实体对象进行不同的操作后其状态会在上述状态之间转换。
update()
upload()方法的主要作用是根据对象的标识符更新持久化对象相应的数据。
将user对象加入到缓存中,并且标识为Persistent状态
生成计划执行的UPDATE语句。
saveOrUpdate()
saveOrUpdate()方法可以根据不同情况对数据库执行INSERT或者UPDATE操作。根据实体对象的状态由Hibernate来决定到底执行save()方法还是update()方法。当处于瞬时态时,执行save()操作,当处于游离态时执行upload()操作。处于持久态时直接返回。
delete()
delete()方法的作用是删除实例所对应的数据库中的记录,相当于执行数据库中的DELETE语句。
get()
get()方法是通过标识符得到指定类的持久化对象。如果对象不存在,则返回值为空。
load()
load()方法和get()方法的用法一样,都是根据实体对象的id值来读取数据库中的记录,并得到与指定记录相对应的实体对象。如果不存在,则产生异常。Load()采用了延迟加载,只有当用户真正请求返回对象的属性时,才会从数据库查询获取属性值。
延迟加载:指当真正需要数据时,才执行真正的数据加载操作。Hibernate3中提供了对实体对象的延迟加载,对集合的延迟加载以及对属性的延迟加载。使用延迟加载可以降低系统的性能开销。延迟加载需手动开启。
contains()
contains()方法可以用来判断一个实体对象是否与当前的Session对象相关联。也可以判断一个实体对象是否处于持久态。
evict()
evict()方法用来管理Session的缓存。当Session打开时间过长或载入数据过多时,会占用大量内存,导致性能下降,甚至可能抛出OutOfMemoryException异常,此时便可调用evict()方法来清除指定的缓存对象。
evict()方法是通过移除缓存中实体对象与Session实例之间的关联关系来清除指定的对象的,执行evict()后,实体对象由持久态转换为游离态。
clear()
clear()方法可以清空Session中的缓存。
createQuery()
createQuery()方法用于建立Query()查询接口的实例,该实例可以使用HQL语言进行数据库的查询操作。
createCriteria()
createCriteria()方法用于建立Criteria查询接口的实例,该实例可以通过设置条件来执行对数据库的查询操作。
createSQLQuery()
createSQLQuery()方法用于建立SQLQuery查询接口的实例。查询接口通过标准的SQL语句来执行数据的查询操作。
createFilter()
createFilter()方法是用于一个持久化集合或者数组的特殊的查询。查询字符串中可以使用this关键字来引用集合中的当前元素。
Transaction接口
Transaction接口主要用于管理事务,是Hibernate的数据库事务接口,它对底层的事务接口进行了封装,这些底层事务接口包括:JDBC API,JTA,CORBA API。
用户可以利用Transaction对象来定义自己的原子操作。Transaction的常用操作有事务提交(commit)和事务回滚(rollback)。
事务是工作中的基本逻辑单位,用于确保数据库能够被正确修改,避免只修改了一部分数据而导致数据不完整,或者在修改时受到其他用户的干扰导致数据的不一致。
数据库向用户提供保存当前程序状态的方法叫事务提交;当事务执行过程中,使数据库忽略当前的状态并回到前面保存的状态的方法叫事务回滚。
事务的特性(ACID):
原子性(Atomicity):将事务中所做的操作捆绑成一个原子单位,即对于事务所进行的数据修改等操作,要么全部执行,要么全部不执行。
一致性(Consistency):事务在完成时,必须使所有的数据都保持其一致状态,而且在相关数据中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。事务结束时,所有的内部数据结构都应是正确的。
隔离性(lsolation):由并发事务所做的修改必须与任何其它事务所作的修改相隔离。事务查看数据时数据所处的状态,要么是被另一并发事务修改之前的状态,要么是另一事务修改后的状态,即事务不会查看另一并发事务正在修改的数据。这种隔离方式也叫可串行性。
持久性(Durability):事务完成后,它对系统的影响是永久的,即使出现系统故障也是如此。
不完全隔离的事务带来的问题:
更新丢失(Lost Update):两个事务都试图去更新一行数据,导致事务抛出异常并退出,这样两个事务的更新都没有实现。
脏数据(Dirty Read):如果第二个应用程序使用了第一个应用程序修改过的数据,而这个数据刚好处于未提交的状态,此时就会发生脏读。
不可重复读(Unrepeatable Read):一个事务两次读同一行数据,但两次读到的数据却不一样,这就叫不可重复读。如果一个事务在提交数据之前,另一个事务可以修改和删除这些数据,就会发生不可重复读。
幻读(Phantom Read):一个事务执行了两次查询,发现第二次查询结果比第一次查询多出一行,这可能是另一个事务在这两次查询之间插入了新行。
隔离级别:
读操作未提交(Read Uncommitted):说明一个事务在提交前,其变化对于其它事务来说是可见的。这样脏读,不可重复读和幻读都是允许的。当一个事务已经写入一行数据但未提交,其它事务都不能再写入此行数据,但是任何事务都可以读任何数据。这个隔离级别使用排他锁实现。
读操作已提交(Read Committed):读取未提交的数据是不允许的,它使用临时的共享锁和排他锁实现。这种隔离级别不允许脏读和不可重复读,但允许幻读。
可重读(Repeatable Read):说明事务保证能够再次读取相同的数据而不会失败。此隔离级别不允许脏读和不可重复读,但允许幻读。
可串行化(Serializable):提供最严格的事务隔离。这个隔离级别不允许事务并行执行,只允许串行执行。
在Hibernate中,对于事务管理有两个选择:本地事务和全局事务。
最后
以上就是斯文钢笔为你收集整理的Hibernate常用接口探究(Configuration,SessionFactory,Session,Transactio)Configuration类SessionFactory接口Session接口Transaction接口的全部内容,希望文章能够帮你解决Hibernate常用接口探究(Configuration,SessionFactory,Session,Transactio)Configuration类SessionFactory接口Session接口Transaction接口所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复