您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 零点起飞学Java Web开发之Hibernate的体系结构及接口
第14章Hibernate结构分析Hibernate作为一个数据持续层组件,在Web应用程序中占据着非常重要的地位。它对JDBC接口进行了封装,将数据库表和JavaBean对象对应起来,从而提供给程序员操作数据库的接口。通过本章的学习,读者可以全面地掌握Hibernate的配置及其接口的使用方法,并且能够在实际开发中熟练地使用这些接口。14.1Hibernate体系结构一览Hibernate可以分为不同的模块,每个模块完成特定的功能。它们结合在一起去完成Hibernate的功能。了解Hibernate的体系结构对学习它也是非常重要的。其体系结构如图所示。14.2Hibernate实体对象的生命周期Hibernate是完整的对象/关系映射解决方案。使用Hibernate开发者不必考虑SQL语句的执行,这部分内容由Hibernate处理,开发者只需要关注JavaBean对象的状态(state)。Hibernate提供了对象状态管理(statemanagement)的功能,使开发者不再需要理会底层数据库系统的细节。Hibernate实体对象可以分为3种状态,下面分别介绍。14.2.1瞬态(Transient)由new操作符创建,且尚未与HibernateSession关联的对象被认定为瞬时(Transient)的。瞬时(Transient)对象和数据库的记录没有任何联系,因而也不会被赋予持久化标识(identifier)。在应用程序中,如果没有保持对瞬时(Transient)对象的引用,它会被垃圾回收器(garbagecollector)销毁。14.2.2持久态(Persistent)一旦一个处于瞬时状态的对象和session相关联,它就转换为持久态(Persistent)。持久的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。持久(Persistent)的实例可能是刚被保存(save)到数据库的,或者是刚从数据库加载(load)的。在与该session断开连接之前,Hibernate会检测到处于持久(Persistent)状态的对象的任何改动,并且在当前操作单元(unitofwork)执行完毕时将对象中的数据与数据库的相关记录同步。14.2.3游离态(Detached)一旦与持久(Persistent)对象关联的session被关闭后,对象就变为脱管(Detached)的。在托管期间,该对象可继续被修改。如果脱管(Detached)对象被重新关联到某个session上,会再次转变为持久(Persistent)的,这时在脱管期间的任何改动都会被保存到数据库中。14.2.4实体对象的状态转换在程序中,一个对象的状态总是在不断改变,正因为这样,才能实现对数据库的操作。Hibernate提供了很多方法去实现状态转变,下面对常用的状态转变情况进行分析。1.使对象持久化一个通过new操作符创建的对象是瞬态的。将一个瞬态对象与一个session相关联,就可以实现该对象的持久化。2.装载对象装载对象一般使用如下所示的两个函数。load():如果知道一个对象的标识(identifier),则就可以使用session的load()方法来获取它。load()的另一个参数是指定类的class对象。该方法会创建指定类的持久化实例,并从数据库加载其数据。3.查询如果不知道对象的标识(identifier),但是知道该对象其他属性的值,则可以使用查询方式获取该对象。Hibernate支持强大且易于使用的面向对象的查询语言(HQL),使用该语言可以通过操作JavaBean来操作数据库。HQL查询要通过org.hibernate.Query的实例来表达。4.修改持久对象在一个对象处于持久态时,程序员对该对象属性的更改在session被刷出(flushed)时会被更新到数据库对应的记录中。所以这里不需要调用某个特定的方法(例如update(),设计该方法有另外的目的)将修改持久化。所以最直接的更新一个对象的方法就是在session处于打开状态时load()它,然后直接修改即可。5.修改脱管(Detached)对象在Web应用中,经常是先通过一个session获取一个持久化对象,然后该session被销毁,并把此时处于Detached状态的对象发送到界面层去操作。最后在一个新的session中保存所做的修改。对于这种情况,Hibernate提供了两个方法保存数据。Session.update():使用update()方法可以将对持久化对象的更改保存到数据库中。下面通过一个例子来讲解如何使用这个方法。6.使用saveOrUpdate()方法saveorUpdate()方法即可自动分配新持久化标识(identifier)保存瞬时(transient)对象,又可更新/重新关联脱管(detached)实例。7.删除持久对象删除持久对象,可以把该对象对应的记录从数据库中删除,但是程序中仍然可以引用该对象。所以可以这样理解:删除一个对象就是把该对象由持久状态转变为瞬时状态,用Session.delete()方法进行删除操作。14.3使用HibernateAPI在应用程序中,需要调用HibernateAPI去操作数据库,所以它们是很重要的。读者一定要掌握这些接口的使用方法。下面结合示例去讲解。14.3.1使用Configuration类org.hibernate.cfg.Configuration实例代表了JavaBean类型到SQL数据库表映射的完整集合,并且也包含所有对Hibernate属性的设置信息。所以也可以把Configuration理解为程序员定义的hibernate.cfg.xml文件在内存中的表示。SessionFactory就是使用Configuration构建而成的。在程序中可以通过Configuration类去加载映射信息,以及设置属性值。14.3.2使用SessionFactory接口当所有映射文件被Configuration解析并加载到内存之后,应用程序必须获得一个用于构造session实例的工厂。这个工厂将被应用程序的所有session共享。14.3.3使用Session接口一旦SessionFactory创建好,就可以用来缓存所有的数据库连接,并且可以给程序员提供一个连接去操作数据库。这时程序员需要做的就是使用SessionFactory实例创建一个session对象,如下所示。Sessionsession=sessions.openSession();然后就可以使用session对象进行操作。14.3.4使用Transaction接口Transaction接口可以通过session对象获取。它主要用来对操作数据库的事务进行管理。一个事务是一个完整的操作单元,或者全部提交,或者全部回滚到提交前的状态。在编程中一般调用其commit()和rollback()方法,它们分别用来提交所有的操作和把所有的操作回滚到原来的状态。14.3.5使用Query接口Query接口用来执行HQL语句,对数据库进行查询。这个接口提供了参数绑定、结果集处理以及运行实际查询的方法。下面对Query接口常用的方法进行讲解。1.Query的使用方法一个查询通常在调用list()时才被执行,执行结果会被装载进内存的一个集合(collection)中。查询返回的对象处于持久(persistent)状态。如果程序员知道的查询只会返回一个对象,可使用list()的快捷方式uniqueResult()。2.迭代式获取结果(Iteratingresults)可以使用Query的iterator()方法迭代式获取查询结果。可以看出,使用iterate()方法,可以对查询结果进行遍历。这样就可以在这个过程中进行一些判断,根据判断的结果决定对这个对象的操作。而这种方式在普通的查询方法中是无法实施的。3.绑定参数在进行查询的过程中,有些作为查询条件的常量是其他变量的值。这时可以使用Query提供的参数绑定的方法去将变量的值赋给查询条件。用“?”代表待定的条件常量,然后用setString()方法把字符串Smith2赋值给它。4.分页操作在Web应用中,经常需要将查询的结果分页显示出来,这就要求一次只能取出所有结果的一个子集,可以通过Query的setFirstResult()和setMaxResults()方法去实现。14.3.6使用Criteria接口Criteria接口使程序员可以动态地使用一种面向对象API创建查询,而非在Java代码中嵌入字符串。14.4小结本章讲解了Hibernate的体系结构、对象的状态,以及Hibernate常用的接口,其中重点要掌握Hibernate接口的使用方法,这对熟练地使用Hibernate是非常重要的。由于篇幅的限制,对于某些接口,本章的讲解可能不是非常详细,读者可以参考Hibernate文档获取其他的资料。通过本章的学习读者可以掌握常用Hibernate接口的使用方法,并且可以使用这些接口进行数据库操作。
本文标题:零点起飞学Java Web开发之Hibernate的体系结构及接口
链接地址:https://www.777doc.com/doc-3882897 .html