




已阅读5页,还剩61页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Hibernate程序设计,第一讲 Hibernate概述 第二讲 对象关系映射基础 第三讲 复杂实体映射 第四讲 关联映射 第五讲 Hibernate查询,Hibernate 程序设计,第一讲 Hibernate 概述,DAO模式的不足,SQL语句出现在程序中,不利于维护、移植; 与java倡导的面向对象的原则相违背; 重复同类编码; 开发人员需要处理底层代码如建立、断开数据库连接等;,O/R Mapping,对象-关系映射就是Java应用中的对象到关系数据库中的表的自动的(和透明的)持久化,使用元数据(meta data)描述对象与数据库间的映射。本质上,ORM的工作是将数据从一种表示转换为另一种。,对象关系映射的优点,提高生产率(Productivity) 减少与业务逻辑无关的代码 可维护性(Maintainability) 对象与关系数据库之间的缓冲区 更好性能(Performance) 厂商独立性(Vendor independence),三个层面的映射,一:Java基本类型表的字段类型 二:Java类 表 三:类之间关系的映射(继承、关联),如何实现?,O/R Mapping 的难点,粒度(granularity)的问题 子类型(subtypes)的问题 同一性(identity)的问题 与关联(associations)有关的问题 对象结构导航的问题,实体Bean的不足,使用复杂,不易掌握; 处理复杂关联关系的能力不足,在使用EJB的同时可能仍然需要使用JDBC API; 不易调试,增加了开发的成本; 分布式的模型在简单应用上不合适; 依赖于容器;,Hibernate 优势,开源 成熟 流行(约13 000 downloads/month) 自定义API JBoss用Hibernate3实现Entity Beans,开发环境,IDE: Eclipse() Hibernate() Database:MySQL+驱动() 可选工具: SQLyog(),示例1,Hibernate 原理,实体对象(Persistent Object) 持久化的对象 Hibernate配置文件 配置数据库连接信息 Hibernate映射文件 配置对象和关系表的映射信息,Hibernate 程序设计,第二讲 Hibernate 映射基础,Hibernate基本配置,Hibernate配置文件 POJO对象 映射文件,Pojo的理解,POJO An acronym for: Plain Old Java Object. The term was coined while Rebbecca Parsons, Josh MacKenzie and I were preparing for a talk at a conference in September 2000. In the talk we were pointing out the many benefits of encoding business logic into regular java objects rather than using Entity Beans. We wondered why people were so against using regular objects in their systems and concluded that it was because simple objects lacked a fancy name. So we gave them one, and its caught on very nicely. 这个名词是我(Martin Fowler)与Rebbecca Parsons,Josh MacKenzie在2000年准备在一个研讨会中演讲时所创造出来的.在这个演讲中,我们指出,将商业逻辑编码成标准(regular)的Java对象,比使用Entity Beans,可以提供更多的好处.但是我们很惊讶,为什么人们如此反对在他们的系统中使用标准对象,我们的结论是:因为简单的对象缺乏一个流行的名称.因此我们给他一个好听的名称,而且这个名称非常贴切. Either EJB (Enterprise JavaBeans) or POJO (plain old Java objects) can be used to build the business-logic tier. EJB with remote interfaces is a better choice if the application is distributed. Since JCatalog is a typical Web application with no remote access required, POJO, with the help of the Spring Framework, is used to implement the business-logic tier. 无论EJB还是POJO都可以用来构建业务逻辑层.如果应用程序是分布式的,则拥有远程接口的EJB是一个很好的选择.而我们的JCatalog是一个典型的没有远程访问需求的Web应用,所以在Spring框架下的POJO被我们用来实现业务逻辑层.,Pojo的理解,POJO 是无需遵循特定外部接口或第三方 API 的 Java 类,Hibernate 架构,实体对象(Persistent Object) 持久化的对象 Hibernate配置文件 配置数据库连接信息 Hibernate映射文件 配置对象和关系表的映射信息,Hibernate核心API,Configuration 负责管理数据库的配置信息。数据库的配置信息包含了Hibernate连接数据库的一些基本信息,Configuration对象可以通过加载配置文件获取并管理这些信息 Configuration conf = new Configuration() conf.configure() File file = new File(“C:myhibernate.xml”); Configuration config = new Configuration().configure(file);,Hibernate配置文件, org.hibernate.dialect.MySQLDialect com.mysql.jdbc.Driver jdbc:mysql:/localhost:3306/hibernate root root true ,Hibernate配置文件,Hibernate核心API,SessionFactory 负责创建Session对象,可以通过Configuration对象创建SessionFactory对象 SessionFactory 对象中保存了当前的数据库配置信息和所有映射关系以及预定义的SQL语句。同时,SessionFactory还负责维护Hibernate的二级缓存。SessionFactory对象的创建会有较大的开销,而且SessionFactory对象采取了线程安全的设计方式,因此在实际中SessionFactory对象可以尽量的共享,在大多数情况下,一个应用中针对一个数据库可以共享一个SessionFactory实例。 如果需要访问2个以上的数据库,可以写多个配置文件,Hibernate核心API,SessionFactory创建方式 Configuration config = new Configuration().configure(); SessionFactory factory = config.buildSessionFactory();,Hibernate核心API,Session 定义了添加、更新、删除和查询等操作,是持久化操作的基础。Session的设计是非线程安全的,因此,一个Session对象只可以由一个线程使用。 Session对象可以由SessionFactory对象创建。 Configuration config = new Configuration().configure(); SessionFactory factory = config.buildSessionFactory(); Session session = factory.openSession();,Session对象常用方法,save get load delete update saveOrUpdate query,Hibernate核心API,Transaction 将应用代码从底层的事务实现中抽象出来这可能是一个JDBC事务,一个JTA用户事务或者甚至是一个公共对象请求代理结构(CORBA)允许应用通过一组一致的API控制事务边界。 使用Hibernate进行操作时(增、删、改)必须显式地调用Transaction(默认:autoCommit=false) Transaction tx = session.beginTransaction(); /do something with database (insert, update) mit();,Hibernate映射文件,映射文件一,Class :定义一个持久化类 name:持久化类(或者接口)的Java名(如果不加Packege的话,要在mapping节点加Package属性) table:对应的数据库表名,默认是类名 discriminator-value:子类辨别标识 mutable:类是否会发生改变,用于脏数据检查 where:数据筛选条件,id:被映射的类必须定义对应数据库表主键字段 name (可选): 标识属性的名字 type (可选): 标识Hibernate类型的名字,建议大家使用对象型的Integer/Long定义主键 column (可选 - 默认为标识属性名): 主键字段的名字 unsaved-value (可选 - 默认为一个字段判断(sensible)的值): 一个特定的标识属性值,用来标志该实例是刚刚创建的,尚未保存。 这可以把这种实例和从以前的session中装载过可能又做过修改) 但未再次持久化的实例区分开来(session.saveOrUpdate时需要判断),映射文件二,Hibernate主键生成方式,Hibernate主键生成方式,映射文件三,property (1) name: 属性的名字,以小写字母开头。 (2) column (可选 - 默认为属性名字): 对应的数据库字段名。 也可以通过嵌套的元素指定。 (3) type (可选): 一个Hibernate类型的名字。 (4) update, insert (可选 - 默认为 true) : 表明用于UPDATE 和/或 INSERT 的SQL语句中是否包含这个被映射了的字段。这二者如果都设置为false 则表明这是一个“外源性(derived)”的属性,它的值来源于映射到同一个(或多个) 字段的某些其他属性,或者通过一个trigger(触发器)或其他程序。 (5) formula (可选): 一个SQL表达式,定义了这个计算 (computed) 属性的值。计算属性没有和它对应的数据库字段。 (6) access (可选 - 默认值为 property): Hibernate用来访问属性值的策略。 (7) lazy (可选 - 默认为 false): 指定实例变量第一次被访问时,这个属性是否延迟抓取(fetched lazily)( 需要运行时字节码增强)。 (8) unique (可选): 使用DDL为该字段添加唯一的约束。 此外,这也可以用作property-ref的目标属性。 (9) not-null (可选): 使用DDL为该字段添加可否为空(nullability)的约束。 (10) optimistic-lock (可选 - 默认为 true): 指定这个属性在做更新时是否需要获得乐观锁定(optimistic lock)。 换句话说,它决定这个属性发生脏数据时版本(version)的值是否增长,Hibernate基本数据类型,构造持久化类,必须有无参的构造器 getter和setter的命名规则 推荐使用id属性 尽量不要用final声明(延迟加载失效) 重载equals和hashCode方法 重用脱管实例 在Set中保存持久化的实例,持久化对象的状态,Transient Objects:使用new 操作符初始化的对象不是立刻就持久的。它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收。 Persist Objects:持久实例是任何具有数据库标识的实例。它由持久化管理器Session统一管理,持久实例是在事务中进行操作的它们的状态在事务结束时同数据库进行同步。当事务提交时,通过执行SQL的INSERT、UPDATE和DELETE语句把内存中的状态同步到数据库中。 Detached Objects:Session关闭之后,持久化对象就变为detached对象。表示这个对象不能再与数据库保持同步,它们不再受Hibernate管理。,持久化对象的生命周期,Hibernate 程序设计,第三讲 Hibernate 高级映射,联合主键,public class Student implements java.io.Serializable private StudentPK pk; public class StudentPK implements java.io.Serializable private String firstName; private String lastName; ,联合主键,组成关系映射,组成关系映射,特殊数据类型的映射,Clob(存储单字节的字符数据 ) Blob(存储二进制数据),自定义类型,Hibernate 程序设计,第四讲 Hibernate 关联映射,集合类映射,Set集合,name 集合属性的名称 table (可选)目标关联数据库表 lazy (可选默认为false)允许延迟加载(lazy initialization ) outer-join 默认auto。 true: 表示使用外连接抓取关联的内容,这里的意思是当使用load(Book.class,“id“)时,Hibernate只生成一条SQL语句将Topic与他的父亲Book全部初始化。 false:表示不使用外连接抓取关联的内容,当load(OrderLineItem.class,“id“)时,Hibernate生成两条SQL语句,一条查询Book表,另一条查询Topic表。这样的好处是可以设置延迟加载,此处要将Order类设置为lazy=true。 auto:具体是ture还是false看hibernate.cfg.xml中的配置,一对多、多对一,一对多、多对一,一对多、多对一,级联操作,Set集合,Set集合,name 集合属性的名称 table (可选)目标关联数据库表 lazy (可选默认为false)允许延迟加载(lazy initialization ) inverse (可选默认为false) 标记由哪一方来维护关联关系(双向关联中使用)。 cascade (可选默认为none) 让操作级联到子实体 order-by (可选, 仅用于jdk1.4) 指定表的字段(一个或几个)再加上asc或者desc(可选), 定义Map,Set和Bag的迭代顺序 where (可选) 指定任意的SQL where条件 outer-join(可选-默认为auto)是否使用外联接,多对多, column(必需): 中间映射表中,关联目标表的关联字段 class (必需): 类名,关联目标类 outer-join (可选 - 默认为auto) column(必需):当前表的关联字段,继承关系映射,继承关系映射,三种继承策略,每棵类继承树使用一个表(table per class hierarchy) 每个子类一个表(table per subclass) 每个具体类一个表(table per concrete class ),Hibernate 程序设计,第五讲 Hibernate 查询,查询概述,概述:数据查询与检索是Hibernate中的一个亮点。相对其他ORM实现而言,Hibernate提供了灵活多样的查询机制。 标准化对象查询(Criteria Query):以对象的方式进行查询,将查询语句封装为对象操作。优点:可读性好,符合Java 程序员的编码习惯。缺点:不够成熟,不支持投影(projection)或统计函数(aggregation) Hibernate语言查询(Hibernate Query Language,HQL):它是完全面向对象的查询语句,查询功能非常强大,具备继承、多态和关联等特性 。Hibernate官方推荐使用HQL进行查询。 Native SQL Queries(原生SQL查询):直接使用数据库提供的SQL方言进行查询。,HQL 实例,from Employee from Vendor as v where v.address=:address and like java% select , dept.description from Department as dept order by desc select new Department(,dept.description) from Department as dept order by asc update Department as dept set =deptname_update where in(:deptlist) delete Department where description is null,HQL 实例,select count(vendor),vendor.address from Vendor as vendor group by vendor.address order by count(vendor) ,标准化对象查询(Criteria Query),Criteria criteria = session.createCriteria(Employee.class); List list = criteria.list(); 增加查询条件: criteria.add(Restrictions.ge(“salary“, new Double(1000);,原生SQL查询,SQLQuery sqlQuery = session.crea
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 药品退货工作管理制度
- 药库药品效期管理制度
- 营运公司安全管理制度
- 设备保养常规管理制度
- 设备备件出库管理制度
- 设备报废制度管理制度
- 设备检修通道管理制度
- 设备管理系统管理制度
- 设备项目安装管理制度
- 设计公司招待管理制度
- SB/T 10279-2017熏煮香肠
- GB/T 6185.2-20162型全金属六角锁紧螺母细牙
- GA/T 1394-2017信息安全技术运维安全管理产品安全技术要求
- IB教育中的PYP介绍专题培训课件
- 2022年桂林市卫生学校教师招聘笔试题库及答案解析
- 栏杆安装单元工程施工质量验收评定表完整
- 外墙清洗服务工程项目进度保障计划
- 2×300MW火电厂电气一次部分设计
- (全新)政府专职消防员考试题库(完整版)
- 岭南版 美术八年级下册 6色彩的表现 教案
- 2022年广东省公务员考试申论真题及参考答案
评论
0/150
提交评论