资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,学习,Hibernate,Java,对象持久化技术 学习,应用程序的分层结构体系,软件的模型,直接通过,JDBC API,来持久化实体域对象,ORM,简介,实体对象的其他持久化模式,Hibernate API,简介,理解,Session,的缓存,在,Hibernate,应用中,Java,对象的状态,Hibernate,简介,什么是,Hibernate,?,Hibernate,是,Java,应用和关系数据库之间的桥梁,它负责,Java,对象和关系数据之间的映射。,Hibernate,内部封装了通过,JDBC,访问数据库的操作,向上层应用提供了面向对象的数据访问,API,。,Hibernate,在分层的软件架构中处于持久化层。,它是连接,java,和关系数据库的中间件。,它是一种,ORM,映射工具,可以建立面向对象的域模型和关系数据模型之间的映射,.,什么是中间件?中间件(,middleware,)是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处于操作系统软件与用户的应用软件的中间。中间件在操作系统、网络和数据库之上,应用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。,1.1,应用程序的分层结构体系,三层结构,是目前典型的一种应用软件结构,表述层,提供与用户交互的界面。如,GUI,和,web,页面。,业务逻辑层,实现各种业务逻辑。,数据库层,负责存放和管理应用的持久性业务数据。,表述层,业务逻辑层,数据库层,1.1.1,区分物理层和逻辑层,软件分层包含两种含义,一种是物理分层。即每一层都运行在单独的机器上,这意味着创建分布式软件系统。,一种是逻辑分层。指在单个软件模块中完成特定的功能。,注,:,如没有特别说明,软件层均指逻辑分层。,1.1.2,软件层的特征,每个软件都有自己的特征,因此不可能有一个适合所有软件的体系结构。但总的来说,软件层必须符合以下特征。,每层由一组相关的类或组件,(,如,EJB),构成,共同完成特定的功能。,层与层之间存在自上而下的依赖关系,即上层组件会访问下层组件的,API,,而,下层组件不应该依赖上层组件。,每个层对上层公开,API,,,当某一层的实现变化时,只要它的,API,不变,不会影响其他层的实现。,由于软件上层总是依赖软件下层,因,此也可以把软件上层称为客户程序,1.1.3,软件分层的优点,恰当的给软件分层将会提高软件的以下性能。,伸缩性,(,支持更多用户,),、可维护性、可重用性,可扩展性,层数越多就可以在每个层中提供扩展点,不会打破应用程序的整体框架。,可管理性,将应用程序分为多层后,可以将工作分解给不同的开发小组,从而便于管理。,1.1.5,Java,对象的持久化,什么是,Java,对象的持久化,?,当实体域对象在内存中创建后,是临时的,他们不能永远存在,.,怎样才可以让其永远存在呢,?,答案,:,对域对象进行持久化。狭义的理解,“持久化”仅仅是把域对象永久保存到数据库中;广义的理解,“持久化”包括和数据库的各种相关操作,如:保存、更新、删除、加载、查询等。,1.2,软件模型,概念模型,关系数据模型,域模型,1.2.1,概念模型,概念模型用来模拟问题域中的真实实体。,概念模型描述了每个实体的概念和属性,以及实体之间的关系,但不描述实体的行为。,创建概念模型的目的是帮助更好地理解问题域,识别系统中的实体,这些实体在设计阶段很有可能变成类。,1.2.2,关系数据模型,关系数据模型是在概念模型的基础上建立起来的,用于描述这些关系数据的静态结构。,组成:,1.,一个或多个表,2.,表的所有索引,3.,视图,4.,触发器,5.,表与表之间的参照完整性,关系数据模型,技巧,:,1.,通常一个实体对应一个表。,2.,每个表都应该通过主键来保证每条纪录的唯一性,表的主键应当不具有任何业务含义,因为任何有业务含义的列都有改变的可能性。,关系数据库学的最重要的一个理论就是:,不要给关键字赋予任何业务意义,。,1.2.3,域模型,域模型是面向对象的,需要在概念模型的基础上创建域模型。,组成:,1.,具有状态和行为的域对象,2.,域对象之间的关系,1.2.4,域对象,域对象是构成域模型的基本元素。即,Domain Object,,,是对真实世界的实体的软件抽象。,域对象还可以叫做业务对象,即,Business Object(BO),。,域对象可以代表业务领域中的人、地点、事物或概念。,组成:,域对象,1.,实体域对象,真实存在的,代表人、地点、事物或概念。例如:客户、订单、商品。通常与表一一对应。在,J2EE,应用中,可以作为实体,EJB,。,在,Web,应用中,可作为包含状态和行为的,JavaBean,。,2.,过程域对象,过程域对象代表应用中的业务逻辑或流程。通常依赖于实体域对象。可把实体域对象做为名词,过程域对象做为动词。如:客户发出订单、登录应用等。在,J2EE,应用中,通常作为会话,EJB,或者消息驱动,EJB,。,在,Web,中就作普通,JavaBean,,,具有管理和控,p;090pp9,制应用的行为。,域对象,3.,事件域对象,代表应用中的一些事件,(,如异常、警告或超时,),。通常由系统中的某种行为触发。,总结,:,在三层应用的结构中,以上三种域对象都位于业务逻辑层,实体域对象是应用的业务数据在内存中的表现形式,而过程域对象用于执行业务逻辑。,1.2.5,域对象之间的关系,在域模型中,类之间存在四种关系。,1.,关联,(Association),2.,依赖,(Dependency),3.,聚集,(Aggregation),4.,泛化,(Generalization),域对象之间的关系,关联,(Association),关联指的是类之间的引用关系,是实体域对象之间最普遍的一种关系。,关联可以分为 一对一、一对多和多对多,3,种关系。,域对象之间的关系,依赖,(Dependency),依赖指的是类之间的访问关系。,如果类,A,访问类,B,的属性或方法,或者类,A,负责实例化类,B,,,那么可以说类,A,依赖,B,。,说白点就是如果类,B,不存在则类,A,也无法存在,所以类,A,必须依赖与类,B,。,域对象之间的关系,与关联关系的区别:,1.,无需把类,B,定义为类,A,的属性。,2.,常见于过程域对象和实体域对象之间。,域对象之间的关系,聚集,(Aggregation),聚集指的是整体与部分之间的关系,也常见于实体域对象之间。如,:,聚集和关联的区别,:,聚集关系和关联关系在类的定义上有相同的形式,对于前者,部分类的对象不能单独存在,有整体才有部分,如果整体消失,部分也随之消失。而对于后者,允许每个类的对象单独存在,域对象之间的关系,泛化,(Generalization),泛化指的是类之间的继承关系,也常见于实体域对象之间。,如,:,public class Teacher,public class,TeacherA,extends Teacher,public class,TeacherB,extends Teacher,1.3,直接通过,JDBC API,来持久化实体域对象,JDBC,直接访问数据库。,业务逻辑和数据访问耦合。在过程域对象中,业务逻辑和数据访问代码混杂在一起。,事例,:,jdbcDemo,1.4 ORM,简介,ORM:,对象,-,关系映射模式,(,即,:,Object-Relation Mapping,),指在单个组件中负责所有实体域对象的持久化,封装数据访问细节,.,作用,:,ORM,主要解决对象,-,关系的映射问题,在概念模型的基础上我们分别建立了域模型和关系模型,前者是面向对象的,后者是面向关系的,一般一个持久化类和一个表对应,类的每个实例对应表中的一条记录,.,当向数据库保存一个域对象时,把业务数据由对象形式映射为关系数据形式;当从数据库加载一个域对象时,把业务数据由关系数据形式映射为对象形式。,1.5,实体对象的其他持久化模式,CMP,模式,英文全称,(Container Managed Persistence,容器管理的持久性,),表示由,EJB,容器来管理实体,EJB,的持久化,,EJB,容器封装了对象,-,关系的映射以及数据访问细节,JDO,模式,Java Data Objects,(,JDO,)是,SUN,公司制定的描述对象持久化语义的标准,API,。,1.5,实体对象的其他持久化模式,在这几种模式中,JDBC,的历史最为悠久,从,Java,诞生的那天起就有了,JDBC,,目前已经发展到,JDBC3.0,了。,JDBC,是一套规范,她规定了统一的标准接口,各个数据库厂商提供标准接口的实现。因此,只需要掌握标准的,SQL,语言就可以访问各种不同的数据库了。,1.6 Hibernate API,简介,提供访问数据库的操作的接口,Session,、,Transaction,和,Query,用于配置的接口:,Configuration,回调接口(使用应用程序接受内部发生的事件,并做出相关的回应),Interceptor,、,Lifecycle,和,Validatable,用于,Hibernate,扩展功能的接口,UserType,、,CompositeUserType,和,IdentifierGenerator,1.6.1Hibernate,的,5,个核心接口,Configuration,接口:,用于配置并启动,Hibernate,。,Hibernate,应用通过,Configuration,实例来指定,-,关系映射文件的位置或者动态配置,Hibernate,的属性。,创建,SessionFactory,实例。,1.6.1Hibernate,的,5,个核心接口,SessionFactory,接口:,一个,SessionFactory,实例对应一个数据存储源,应用中通过其可以获得,Session,实例。,它是线程安全的,同一实例可被多个线程共享。,它是重量级的,不能随意创建或销毁其实例。通常一个数据库只需创建一个,SessionFactory,实例。,1.6.1Hibernate,的,5,个核心接口,Session,接口,不是线程安全的,因此应用中我要避免多个线程共享同一个,Session,实例。,是轻量级的,所谓轻量级指它的创建和销毁不需消耗太多的资源。,注:,Session,有一个缓存,被称为,Hibernate,的第一级缓存,.,存放被当前工作单元加载的对象,仅能被当前工作单元访问。,1.6.1Hibernate,的,5,个核心接口,Transaction,接口,是,Hibernate,的数据库事务接口,它封装了底层的事务接口,(,如,JDBC API,、,JTA),为,Hibernate,提供一致的事务边界声明,1.6.1Hibernate,的,5,个核心接口,Query,和,Criteria,接口,是,Hibernater,的查询接口。,用于向数据库查询对象,控制执行查询的过程。,Query,实例包装一个,HQL,查询语句。,Criteria,完全封装了基于字符串形式的查询语句,擅长于执行动态查询。,1.6.2,回调接口,当一个对象发生了特定的事件,(,如加载,.),时,Hibernate,应用通过回调接口来响应这一事件,.,Lifecycle,和,Validatable,接口,:,这两个接口需要由持久化类来实现,.,前者使持久化类的实例能响应被加载、保存或删除的事件。,后者使用持久化类的实例在被保存之前进行数据验证。,移植性差,不推荐使用,1.6.2,回调接口,Interceptor,接口:,不必由持久化类实现,可以定义专门实现,I,接口的类,负责响应持久化类的实例被加载、保存、更新或删除的事件。,总结,到此,Hibernate,涉及到的概念基本讲述完毕大家对,Hibernate,应该有所了解了!还有什么疑问吗?,
展开阅读全文