Hibernate教程讲师用.doc
《Hibernate教程讲师用.doc》由会员分享,可在线阅读,更多相关《Hibernate教程讲师用.doc(24页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流Hibernate教程讲师用.精品文档.Hibernate教程前言1、 java对象持久化技术1.1 、hibernate是什么1.2、软件模型1.2.1、概念模型1.2.2、关系数据模型1.2.3、域模型1.2.4、域对象1.2.5、域对象之间的关系1.2.6、域对象的持久化概念提示:1.3、数据库访问模式1.3.1、ORM模式1.3.2、主动域对象模式1.3.3、JDO模式1.3.4、CMP模式一、数据源层O/R Mapping主要介绍三层架构,如何分层?(逻辑上的分层,二个原则)数据层技术的选择:直接使用1.1、SQL/JDBC:优点:
2、很多开发者熟悉关系数据库管理系统,理解SQL,也知道如何使用表和外键进行工作。此外,他们可以始终使用众所周知并广泛使用的DAO设计模式对业务逻辑隐藏复杂的JDBC代码和不可移植的SQL。缺点:为域中的每个类手工编写持续性代码的工作是非常可观的,特别是需要支持多种SQL方言时。这项工作通常会消耗很大一部分的开发努力。此外,当需求改变时,一个手工编码的解决方案总是需要更多的注意和维护努力。1.2、序列化:Java有一个内建的持久化机制:序列化提供了将对象图(应用状态)写到字节流中的能力,然后它可能被持久化到文件或数据库中。持久化也被Java的远程方法调用(RMI)使用来为复杂对象传递值语义。持久化
3、的另一种用法是在机器集群中跨节点复制应用状态。缺点:很不幸,一个相互连接的对象图在序列化之后只能被当作一个整体访问,如果不反序列化整个流就不可能从流中取出任何数据。这样,结果字节流肯定会被认为不适合进行任意的检索或聚合。甚至不可能独立地访问或更新一个单独的对象或子图。非常明显,因为当前特定的技术,序列化不适合于作为高并发性的Web和企业应用的持久化机制。在特定的环境中它被作为桌面应用的适当的持久化机制。1.3EJB entity beansEJB1.1实体Bean在实践中彻底地失败了。EJB规范的设计缺陷阻碍了Bean管理的持续性(BMP)实体Bean有效地执行。在EJB1.1许多明显的缺陷被
4、纠正之后,一个边缘的稍微可接受的解决方案是容器管理的持续性(CMP)。然而,CMP并不能表示一种对象-关系不匹配的解决方案。CMP缺点: CMP实体Bean的粒度既太粗又太细:CMP Bean与关系模型中的表是按照一对一的方式定义的。这样,它们的粒度过粗,不能够完全利用Java丰富的类型。 虽然EJB可以利用继承实现,但实体Bean并不支持多态的关联和查询 不管EJB规范所宣称的目标,实体Bean实际上是不可移植的。CMP引擎的性能因厂商而异,并且映射元数据也是高度特定于厂商的。 实体Bean不可序列化。我们发现当我们需要将数据传输到远程客户层时,我们必须定义额外的数据传输对象(DTO,也被称
5、作值对象) 实体Bean必须依赖于EJB容器测试困难。JDO、Object-oriented database systems大多数面向对象的数据库系统对ODMG标准都提供了许多程度的支持,但据我们所知,还没有完全的实现。此外,在规范发布以后的很多年,甚至到了3.0版,还是感觉不太成熟,并且缺乏很多有用的特征,特别是基于Java环境的。ODMG也不再活跃。最近,Java数据对象(JDO)规范(发表于2002年4月)揭开了新的可能性。JDO由面向对象数据库团体的成员驱动,除了对现有的ODMG的支持之外,面向对象的数据库产品现在还经常将其作为主要的API采用。JDO 的优点在于它很简单。开发人员使
6、用 Java 语言持久存储对象实例并从存储器检索实例。处理逻辑、同步和故障转移等均被透明地处理。开发人员无需使用 SQL 或 Java 语言提供的不便的序列化机制,只使用 POJO(无格式普通 Java 对象)即可,利用 JDO 接口将对象引用传递到存储器中并从存储器检索对象引用。1.4、O/R Mapping1.4.1什么是O/R Mapping?它有什么优点?简单地说,对象-关系映射就是Java应用中的对象到关系数据库中的表的自动的(和透明的)持久化,使用元数据(meta data)描述对象与数据库间的映射。本质上,ORM的工作是将数据从一种表示(双向)转换为另一种。1.4.1.1提高生产
7、率(Productivity)与持久性有关的代码可能是Java应用中最乏味的代码。Hibernate去掉了很多让人心烦的工作(多于你的期望),让你可以集中更多的精力到业务问题上。不论你喜欢哪种应用开发策略自顶向下,从域模型开始;或者自底向上,从一个现有的数据库模式开始使用Hibernate和适当的工具将会减少大量的开发时间。1.4.1.2可维护性(Maintainability) 减少了代码,重构更方便,提高了可维护性。ORM是对象和关系数据库之间的缓冲区,用来很好的将他们隔离。1.4.1.3更好性能(Performance)ORM软件的实现人员可能有比你更多的时间来研究性能优化问题。你知道吗
8、,例如,缓存PreparedStatement的实例对DB2的JDBC驱动导致了一个明显的性能增长但却破坏了InterBase的JDBC驱动?你了解吗,对某些数据库只更新一个表中被改变的字段可能会非常快但潜在地对其它的却很慢?在你手工编写的解决方案中,对这些不同策略之间的冲突进行试验是多么不容易呀?1.4.1.4厂商独立性(Vendor independence)ORM抽象了你的应用使用下层SQL数据库和SQL方言的方式。如果工具支持许多不同的数据库(dialect),那么这会给你的应用带来一定程度的可移植性。你不必期望可以达到“一次编写,到处运行”,因为数据库的性能不同并且达到完全的可移植性
9、需要牺牲更强大的平台的更多的力气。然而,使用ORM开发跨平台的应用通常更容易。即使你不需要跨平台操作,ORM依然可以帮你减小被厂商锁定的风险。另外,数据库独立性对这种开发情景也有帮助:开发者使用一个轻量级的本地数据库进行开发但实际产品需要配置在一台不同的数据库上。1.5对象关系的不匹配范式(paradigm)1.5.1粒度(granularity)的问题。增加一种新的数据类型,将Java地址对象在我们的数据库中保存为单独的一列,听起来好像是最好的方法。毕竟,Java中的一个新的地址类与SQL数据类型中的一个新的地址类型可以保证互用性。然而,如果你检查现在的数据库管理系统对用户定义列类型(UDT
10、)的支持,你将会发现各种各样的问题。1.5.1.1子类型(subtypes)的问题。 子类型不匹配是指Java模型中的继承结构必须被持续化到SQL数据库中,而SQL数据库并没有提供一个支持继承的策略。如何解决多态?1.5.1.2同一性(identity)的问题Java对象定义了两种不同的相等性的概念: 对象同一性(粗略的等同于内存位置的相等,使用a=b检查) 通过equals()方法的实现来决定的相等性(也被称作值相等)另一方面,数据库行的同一性使用主键值表示。主键既不必然地等同于“equals()”也不等同于“=”。它通常是指几个对象(不相同的)同时表示了数据库中相同的行。而且,为一个持续类
11、正确地实现equals()方法包含许多微妙的难点。1.5.1.3与关联(associations)有关的问题面向对象的语言使用对象引用和对象引用的集合表示关联。在关系世界里,关联被表示为外键列,外键是几个表的键值的拷贝。这两种表示之间有些微妙的不同。1、 对象结构导航的问题在Java中访问对象的方式与在关系数据库中有根本的不同。在Java中,访问用户的账单信息时,你调用aUser.getBillingDetails().getAccountNumber()。这是最自然的面向对象数据的访问方式,通常被形容为遍历对象图。根据实例间的关联,你从一个对象导航到另一个对象。不幸地是,这不是从SQL数据库
12、中取出数据的有效方式。为了提高数据访问代码的性能,唯一重要的事是最小化数据库请求的次数。最明显的方式是最小化SQL查询的数量(其它方式包括使用存储过程或者JDBC批处理API)。使用SQL有效地访问关系数据通常需要在有关的表之间使用连接。在连接中包含的表的数量决定了你可以导航的对象图的深度。性能:N+1的问题范式不匹配的代价:1、花费很多时间和精力来手工解决对象和关系的不匹配。2、为了解决不匹配,甚至要扭曲对象模型直到它与下层的关系技术匹配为止1、 JDBC API本身的问题。JDBC和SQL提供了一个面向语句(即命令)的方法从SQL数据库中来回移动数据。至少在三个时刻(Insert,Upda
13、te,Select)必须指定一个结构化关系,这增加了设计和实现所需要的时间。1.6、主流持久层框架纵览目前众多厂商和开源社区都提供了持久层框架实现,常见的有:Apache OJB(http:/db.apache.org/ojb/ )Cayenne(http:/objectstyle.org/cayenne/ )Jaxor( )Hibernate(http:/www.hibernage.org)iBATIS( )jRelationalFramework()mirage(http:/itor.cq2.org/en/oss/mirage/toon)SMYLE(http:/www.drjava.de/
14、smyle/)TopLink( )(其中TopLink 是Oracle 的商业产品。其他均为开源项目)1.6.1Apache OJB 它的优势在于对各种标准的全面支持(不过事实上,我们的系统研发中并不需要同时支持这么多标准,追求多种标准的并行支持本身也成为Apache OJB 项目发展的沉重包袱),且其从属于Apache 基金组织,有着可靠的质量保证和稳定的发展平台。1.6.2Hibernate 在2003 年末被JBoss 组织收纳,成为从属于JBoss 组织的子项目之一,从而赢得了良好的发展前景(同时荣获Jolt 2004 大奖)。Hibernate 与OJB 设计思想类似,具备相近的功能
15、和特色,但由于其更加灵活快速的发展策略,得到了广大技术人员的热情参与,因此也得到了更广泛的推崇。相对ApacheOJB 迟钝的项目开发进度表,Hibernate 活跃的开发团队以及各社区内对其热烈的关注为其带来了极大的活力,并逐渐发展成Java 持久层事实上的标准。1.6.3iBATIS 相对Apache OJB 和Hibernate 项目则另具特色,iBATIS 采取了更加开放式的设计,通过iBATIS,我们可以控制更多的数据库操作细节。相对而言,Hibernate、Apache OJB 对持久层的设计则较为封闭,封闭化的设计对持久层进行了较为彻底的封装,从而将底层细节与上层架构完全分离,大
16、多数情况下,特别是对于新系统,新产品的研发而言,封闭化的设计带来了更高的开发效率和更好的封装机制,但是在某些情况下,却又为一些必须的底层调整带来了阻力,如在对遗留系统的改造和对既有数据库的复用上,表现出灵活性不足的弱点。此时作为OJB,Hibernate 的一个有益补充,iBATIS的出现显得别具意义。二、Hibernate入门2.1、Hibernate概述Hibernate是非常优秀、成熟的O/R Mapping框架。它提供了强大、高性能的Java对象和关系数据的持久化和查询功能。(O/R Mapping是一项实用的工程技术,把数据库的E/R模型用java的OO语法描述出来,Hibernat
17、e是其中的当之无愧的最耀眼的明星,cglib动态增强,多种灵活的class继承树映射机制,广泛的社团支援,掩盖了其他项目的光辉。)2.2、Hibernate的优势 开源(LGPL) 成熟 流行(约13 000 downloads/month) 自定义APIJBoss 将用Hibernate3实现Entity Beans2.3、使用Hibernate的开发步骤1、 设计一般首先进行领域对象的设计。因为在Hibernate中,我们的领域对象可以直接充当持久化类。2、 映射定义Hibernate的映射文件,实现持久化类和数据库之间映射。3、 应用使用Hibernate提供的API,实现具体的持久化业
18、务。2.4、Hibernate的映射Entity-hbm-ddl(数据库)(hbm(hibernate mapping)和ddl(Data Definition Language)的全称)之间的互相转换User.java User.hbm.xmlXDoclet:它通过在Java源代码中加入特定的JavaDoc tag,从而为其添加特定的附加语义,之后通过XDoclet工具对代码中JavaDoc Tag进行分析,自动生成与代码对应的配置文件(Middlegen: 用来从数据库中已有的表结构中生成Hibernate映射文件。当前版本是2.1可以去http:/boss.bekk.no/boss/mi
19、ddlegen下载。2.5、Hibernate核心接口2.5.1、Configuration:正如其名,Configuration 类负责管理Hibernate 的配置信息。Hibernate 运行时需要获取一些底层实现的基本信息,其中几个关键属性包括:1、数据库URL2、数据库用户3、数据库用户密码4、数据库JDBC驱动类5、数据库dialect(方言),用于对特定数据库提供支持,其中包含了针对特定数据库特性的实现,如Hibernate数据类型到特定数据库数据类型的映射等。6、当然,还有指定Hibernate映射文件的位置。(*.hbm.xml)。Hibernate配置有两种方法:一、 属性
20、文件配置。默认文件名是hibernate.properties。调用代码: Configuration config = new Configuration();二、 XML文件配置。默认文件名是hibernate.cfg.xml。Configuration config = new Configuration().configure();2.5.2、SessionFactory:应用程序从SessionFactory(会话工厂)里获得Session(会话)实例。它打算在多个应用线程间进行共享。通常情况下,整个应用只有唯一的一个会话工厂例如在应用初始化时被创建。然而,如果你使用Hibernat
21、e访问多个数据库,你需要对每一个数据库使用一个会话工厂。会话工厂缓存了生成的SQL语句和Hibernate在运行时使用的映射元数据。它也保存了在一个工作单元中读入的数据并且可能在以后的工作单元中被重用(只有类和集合映射指定了使用这种二级缓存时才会如此)。SessionFactory sessionFactory = config.buildSessionFactory();2.5.3、Session(会话):该接口是Hibernate使用最多的接口。Session不是线程安全的,它代表与数据库之间的一次操作。Session通过SessionFactory打开,在所有的工作完成后,需要关闭:它的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Hibernate 教程 讲师
限制150内