《第11章 Hibernate的体系结构ppt课件.ppt》由会员分享,可在线阅读,更多相关《第11章 Hibernate的体系结构ppt课件.ppt(25页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第11章章 Hibernate的体系结构的体系结构第十一章第十一章Hibernate的体系结构的体系结构Hibernate的体系结构的体系结构-1“轻型轻型”应用程序的结构应用程序的结构 Hibernate体系结构体系结构 Hibernate的体系结构的体系结构-2“全面解决全面解决”应用程序的结构应用程序的结构 SessionFactorynSessionFactory的定义的定义v针对单个数据库映射关系经过编译后的内存镜像。它是针对单个数据库映射关系经过编译后的内存镜像。它是生成生成Session的工厂,本身要用到的工厂,本身要用到ConnectionProvider。该对象可以在进程或
2、集群的级别上,为那些事务之间。该对象可以在进程或集群的级别上,为那些事务之间可以重用的数据提供可选的二级缓存。可以重用的数据提供可选的二级缓存。vSessionFactory中保存了对应当前数据库配置的所有映中保存了对应当前数据库配置的所有映射关系,它是将某个数据库的所有映射关系经过编译后射关系,它是将某个数据库的所有映射关系经过编译后保存在内存中的。保存在内存中的。vSessionFactory还可以在进程或集群的基础上,为那些还可以在进程或集群的基础上,为那些事务之间可重用的数据提供二级缓存。事务之间可重用的数据提供二级缓存。SessionnSession是什么是什么v Session是是
3、Hibernate进行持久化操作的基础,所有的持久化操作都进行持久化操作的基础,所有的持久化操作都是在是在Session的基础上完成的。它表示应用程序与持久储存层之间交的基础上完成的。它表示应用程序与持久储存层之间交互操作的一个单线程对象,此对象生存期很短。其隐藏了互操作的一个单线程对象,此对象生存期很短。其隐藏了JDBC连接连接,也是,也是Transaction的工厂。其会持有一个针对持久化对象的必选(的工厂。其会持有一个针对持久化对象的必选(第一级)缓存,在遍历对象图或者根据持久化标识查找对象时会用第一级)缓存,在遍历对象图或者根据持久化标识查找对象时会用到。到。SessionnHiber
4、nate中的中的Sessionv 就相当于就相当于JDBC中的中的Connection对象所起的作用。它是对象所起的作用。它是Hibernate是是持久化管理器的核心,提供了一系列的持久化操作方法,例如:持久化管理器的核心,提供了一系列的持久化操作方法,例如:save,update,delete和和find等。等。v 另外,另外,Session还持有一个针对持久化对象的一级缓存,在便利持久还持有一个针对持久化对象的一级缓存,在便利持久化对象或者根据持久化表示查找对象的时候将会使用到。化对象或者根据持久化表示查找对象的时候将会使用到。事务事务Transactionn事务事务Transaction
5、的作用的作用v通过通过Transaction对象,用户可以将多个持久化操作组合对象,用户可以将多个持久化操作组合成一个原子操作,使这些操作要么能全部执行成功,要成一个原子操作,使这些操作要么能全部执行成功,要么就都不被执行。么就都不被执行。 vTransaction对象是通过对象是通过Session对象产生的,所以它的对象产生的,所以它的生命周期要短于生命周期要短于Session对象。一个对象。一个Session的生命周期的生命周期内可能包括多个内可能包括多个Transaction对象。对象。 Hibernate核心组件核心组件nHibernate主要包括主要包括3个组件:个组件: v连接管理
6、组件:连接管理组件:Hibernate的连接管理服务提供了高效的连接管理服务提供了高效的数据库连接管理的数据库连接管理 .v事务管理组件:事务管理组件是数据库应用程序中需要事务管理组件:事务管理组件是数据库应用程序中需要特别处理的工作。特别处理的工作。 v对象对象/关系映射组件:对象关系映射组件:对象/关系映射技术可以实现从对关系映射技术可以实现从对象模型到数据库关系模型的映射工作。象模型到数据库关系模型的映射工作。 实例生命周期实例生命周期 n一个持久化类的实例可能处于三种不同状态中的某一个持久化类的实例可能处于三种不同状态中的某一种一种vTransient(瞬态),(瞬态),vPersis
7、tent(持久态)和(持久态)和vDetached(脱管态)(脱管态) 一个实体对象的实例通过不同的操作可以在这一个实体对象的实例通过不同的操作可以在这3种种状态之间相互装换。状态之间相互装换。Transient(瞬态)(瞬态)该实体从未与任何持久化上下文关联过,它没有持久化标该实体从未与任何持久化上下文关联过,它没有持久化标识(相当于主键)。换句话讲,即该实体对象在内存中是自识(相当于主键)。换句话讲,即该实体对象在内存中是自由存在的,也就是说与数据库中数据没有任何关系。下面来由存在的,也就是说与数据库中数据没有任何关系。下面来看一段代码:看一段代码:/创建一个瞬态对象创建一个瞬态对象Use
8、r user = new User();user.setName(username);user.setPassword(“test”);/user仍然是一个瞬态对象仍然是一个瞬态对象瞬态的实体对象具有以下几个特征:瞬态的实体对象具有以下几个特征:n没有通过没有通过Session对象的实例对其进行过任何持久化的操作。对象的实例对其进行过任何持久化的操作。n与数据库中的记录没有任何关系。与数据库中的记录没有任何关系。Persistent(持久态)(持久态) n实例目前与某个持久化上下文有关联。它拥有持久化标识(实例目前与某个持久化上下文有关联。它拥有持久化标识(相当于主键值),并且可能在数据库中有
9、一个对应的行相当于主键值),并且可能在数据库中有一个对应的行 ./ 创建创建.-个瞬态对象个瞬态对象User user = new User();user.setName(username);user.setPassword(test);/ user仍然是仍然是-个瞬态对象个瞬态对象Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();/ 此时此时 user对象仍然是对象仍然是Transient状态状态session.save(user);/ 此时,此时,user对象
10、已经被纳入了对象已经被纳入了Hibernate的实体管理容器中,并转变的实体管理容器中,并转变为为Persistent状态状态Detached(脱管态)(脱管态) n实例曾经与某个持久化上下文发生过关联,不过那实例曾经与某个持久化上下文发生过关联,不过那个上下文被关闭了,或者这个实例是被序列化(个上下文被关闭了,或者这个实例是被序列化(serialize)到另外的进程。它拥有持久化标识,并)到另外的进程。它拥有持久化标识,并且在数据库中可能存在一个对应的行。且在数据库中可能存在一个对应的行。.session.save(user);/ 此时,此时, user对象已经被纳入了对象已经被纳入了 Hi
11、bernate的实体管理容的实体管理容器中,并转变为器中,并转变为Persistent状态状态 mit();/ 事务被提交后,将向数据库的用户表中插入一条记录事务被提交后,将向数据库的用户表中插入一条记录session.close();/ user对象此时变为了对象此时变为了Detached状态。状态。 API简介简介-Session接口接口-1 nSession接口接口vSession是是Java应用程序和应用程序和Hibernate进行交互时所使用进行交互时所使用的主要接口,这也是持久化操作的核心的主要接口,这也是持久化操作的核心API。Session对对象是有生命周期的,它以象是有生命周
12、期的,它以Transaction对象的事务开始和对象的事务开始和结束为边界。结束为边界。vSessiom对象不是线程安全的,每个调用者应该使用对象不是线程安全的,每个调用者应该使用SessionFactory实例获得自己的实例获得自己的Session实例。实例。Configuration config = new Configuration().configure();SessionFactory sessionFactocy = config.buildSessionFactory();Session session = sessionFactory.openSession();n利用利用S
13、ession进行查询的几种方法进行查询的几种方法vcreateQuery()方法方法创建一个创建一个Query查询接口的实例,该实例可以利用查询接口的实例,该实例可以利用HQL语言进行数据库语言进行数据库的查询操作。的查询操作。vcreateCriteria()方法方法创建一个创建一个Criteria查询接口的实例。查询接口的实例。vcreateSQLQuery()方法方法创建一个创建一个SOLQuery查询接口的实例。该查询接口通过标准的查询接口的实例。该查询接口通过标准的SQL语句语句来执行数据的查询操作。来执行数据的查询操作。vcreateFilter()方法方法通过一个对象的集合以及查
14、询的通过一个对象的集合以及查询的HQL语句来生成一个语句来生成一个Query对象的实例对象的实例。利用利用Session进行查询进行查询 利用利用Session进行实体对象操作进行实体对象操作-1 nsave()方法方法用于完成瞬态对象实例的持久化操作,相当于执行数据库用于完成瞬态对象实例的持久化操作,相当于执行数据库的的Insert语句。完整使用语句。完整使用save()持久化实体对象的代码清持久化实体对象的代码清单如下所示:单如下所示:User user = new User();user.setName(abc + String.valueOf(Math.random();user.se
15、tPassword(def);Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();session.save(user);mit();session.close();ndelete()方法方法delete()方法的作用是删除该实例对象所对应的数据库中的记方法的作用是删除该实例对象所对应的数据库中的记录,相当于执行数据库的录,相当于执行数据库的DELETE语句。这里所进行的删除语句。这里所进行的删除操作是根据这个实体对象的标识符(或者说是表中得主键值操作是根据这个实体对
16、象的标识符(或者说是表中得主键值)来进行的。)来进行的。通过通过Session对象的对象的delete()方法删除实体对象的典型过程如下所示:方法删除实体对象的典型过程如下所示:User user = new User();user.setId(12345678); / 设置标识符的值是必须的!设置标识符的值是必须的!Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();session.delete(user);mit();session.close();利用利用Se
17、ssion进行实体对象操作进行实体对象操作-2nupdate()方法方法根据对象实例的标识符来更新持久化对象实例所对应的数据,根据对象实例的标识符来更新持久化对象实例所对应的数据,相当于执行数据库的相当于执行数据库的UPDATE语句。因为语句。因为id是表的主键,能是表的主键,能够标识一个唯一的记录,所以该字段所对应的属性也就是该够标识一个唯一的记录,所以该字段所对应的属性也就是该持久化对象的标识符。持久化对象的标识符。下面是完整使用下面是完整使用update()方法更新数据库中记录的代码清单。方法更新数据库中记录的代码清单。User user = new User();user.setNam
18、e(abc + String.valueOf(Math.random();user.setPassword(def);user.setId(12345678); / 设置标识符的值是必须的!设置标识符的值是必须的!Session session = sessionFactory.openSession();Transaction tx = session.beginTransaction();session.update(user);mit();session.close();利用利用Session进行实体对象操作进行实体对象操作-3nsaveOrUpdate()方法方法根据对象实例的标识符来
19、执行持久化操作,它可以确保该对象被执行持根据对象实例的标识符来执行持久化操作,它可以确保该对象被执行持久化操作。相当于根据不同的情况执行数据库的久化操作。相当于根据不同的情况执行数据库的INSERT或者或者UPDATE操作。操作。nget()方法方法通过标识符得到指定类的持久化对象的实例。通过标识符得到指定类的持久化对象的实例。get()方法只能得到唯一的方法只能得到唯一的一个持久化对象,该对象如果不存在,那么返回值为空。一个持久化对象,该对象如果不存在,那么返回值为空。nload()方法方法通过标识符得到指定类的持久化对象的实例。这个方法和上面的通过标识符得到指定类的持久化对象的实例。这个方
20、法和上面的get()方方法的区别应该确保所要得到的持久化对象的实例存在,否则,将会产生法的区别应该确保所要得到的持久化对象的实例存在,否则,将会产生异常信息。异常信息。nevict()方法方法用于移除一个实体对象与用于移除一个实体对象与Session对象之间的关联关系,也就是将一个对象之间的关联关系,也就是将一个实体对象由实体对象由Persistent状态转变为状态转变为detached状态。状态。ncontains()方法方法contains()方法用于判断一个实体对象是否与当前的方法用于判断一个实体对象是否与当前的Session对象相关对象相关联,这个方法可以用来判断一个实体对象是否处于联
21、,这个方法可以用来判断一个实体对象是否处于Persistent状态。状态。利用利用Session进行实体对象操作进行实体对象操作-4SessionFactory接口接口 SessionFactory的的Session对象的一个工厂类对象的一个工厂类,在通常情况下,一个应用程序只有一个,在通常情况下,一个应用程序只有一个SessionFactory的实例,并且的实例,并且SessionFactory的的实例是不可以进行改变的,它是通过单例的设计模实例是不可以进行改变的,它是通过单例的设计模式达到这个目的的,因此,它也是线程安全的。通式达到这个目的的,因此,它也是线程安全的。通常创建常创建Sess
22、ionFactory市里的方法如下清单所示。市里的方法如下清单所示。Configuration config = new Configuration().configure();SessionFactory sessionFactocy = config.buildSessionFactory();Configuration类类 nConfiguration对象的作用是读取配置文件并创建对象的作用是读取配置文件并创建SessionFactory对象。通常一个应用程序会创建一对象。通常一个应用程序会创建一个个Configuration对象,然后建立唯一的对象,然后建立唯一的SessionFact
23、ory实例。实例。 nConfiguration类自动在当前的类自动在当前的CLASSPATH所指所指定的路径内查找文件。定的路径内查找文件。File file = new File(d:devmyappetchibernate.xml);Configuration config = new Configuration().configure(); Query接口接口-1 Query接口是用来完成执行自定义的查询语句接口是用来完成执行自定义的查询语句的功能,在的功能,在Hibernate中,目前支持中,目前支持3种检索方式,种检索方式,分别是分别是HQL、QBC和和SQL。其中,。其中,HQL
24、是面向对是面向对象的查询语言,它和象的查询语言,它和SQL查询语言类似,在现阶段查询语言类似,在现阶段的应用中,的应用中,HQL检索方式是被使用的最广泛的,因检索方式是被使用的最广泛的,因此,本书也主要以此,本书也主要以HQL检索为重点来介绍检索为重点来介绍Hibernate的自定义查询功能。的自定义查询功能。 在在Hibernate中,使通过中,使通过Query接口来执行接口来执行HQL语句并完成对语句并完成对象的检索操作的,主要具有以下功能:象的检索操作的,主要具有以下功能:通过各种条件来执行数据库的查询。通过各种条件来执行数据库的查询。支持分页查询,并且特别针对不同的数据库做了不同的处理
25、。支持分页查询,并且特别针对不同的数据库做了不同的处理。支持连接查询。支持连接查询。主持分组查询。主持分组查询。支持各种聚集函数。支持各种聚集函数。支持个种子查询。支持个种子查询。能够调用自定义函数。能够调用自定义函数。支持动态绑定查询参数。支持动态绑定查询参数。可以通过可以通过Session对象的对象的createQuery()方法可以得到一个方法可以得到一个Query对象的实例,通过对象的实例,通过Query对象可以设置查询语句的参对象可以设置查询语句的参数。另外,数。另外,Query对象还有对象还有3个非常重要的方法用于指定获个非常重要的方法用于指定获取的结果集的范围。它们分别是取的结果
26、集的范围。它们分别是setMaxResults(),setFirstResult()和和setFetchSize()。 Query接口接口-2 Criteria接口接口QBC查询方式提供了一种面向对象的检索方式,使用查询方式提供了一种面向对象的检索方式,使用QBC查询方式的就是调用查询方式的就是调用Criteria接口。接口。Criteria本身只是本身只是一个查询容器,具体的查询条件是通过调用一个查询容器,具体的查询条件是通过调用Criteria的的add()方法进行添加的。方法进行添加的。List cats = session.createCriteria(Cat.class).add(R
27、estrictions.like(name, Iz%).add(Restrictions.gt(weight, new Float(100).addOrder(Order.asc(age).list();上面的实例相当于执行了如下所示的上面的实例相当于执行了如下所示的SQL语句:语句:select * from cat where name like Iz% and weight100 order by age ascCriteria接口所实现的是传统接口所实现的是传统SQL语句的对象化封装。语句的对象化封装。Hibernate在运行时会依据为在运行时会依据为Criteria指定的查询条件生成
28、相指定的查询条件生成相应的应的SQL语句。语句。Transaction接口接口 nTransaction接口主要用于管理事务,用户可以使用接口主要用于管理事务,用户可以使用Transaction对象定对象定义自己的原子操作。一个义自己的原子操作。一个Transaction对象的事务可能包括多个数据库对象的事务可能包括多个数据库进行的操作,通过进行的操作,通过Session对象的对象的beginTransaction()方法可以得到一方法可以得到一个个Transaction对象的实例。对象的实例。Session sess = sessionFactory.openSession();Transaction tx = null;try tx = sess.beginTransaction();/ do some mit(); catch (Exception e) if (tx != null)tx.rollback();throw e; finally sess.close();