hibernate基础.ppt_第1页
hibernate基础.ppt_第2页
hibernate基础.ppt_第3页
hibernate基础.ppt_第4页
hibernate基础.ppt_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Hibernate介绍,内容,概述和特性 体系结构 持久化对象和数据库映射 集合类映射和关联映射 继承映射 事务和并发 HQL(Hibernate Query Language)查询语句 条件查询(Criteria) 缓存和性能,概述和特性,ORM(Object/Relational Mapping):对象、关系数据库映射表示一种技术,用来把对象模型表示的对象映射到基于SQL的关系模型数据结构中去。 可以大幅度减少开发人员使用SQL和JDBC处理数据的时间。 可以帮助你消除和包装那些特定厂商的SQL代码,并把结果集从表格的形式转换到一系列的对象中去。例如: MySQL的分页语句是: selec

2、t * from fm_alarm limit 0, 100; Oracle的分页语句是: select * from ( select row_.*, rownum rownum_ from fm_alarm row_ where rownum 0 Hibernate分页: Query q = session.createQuery(“from Alarm alarm”); q.setFirstResult(0); q.setMaxResult(100);,支持对象化的查询语句(HQL)和编程方式的(Criteria)查询 支持缓存:一级缓存(Session级),二级缓存(SessionFa

3、ctory级) 支持并发控制:乐观锁定和悲观锁定 支持持久化对象之间的级联操作,体系结构,SessionFactory:针对单个数据库映射关系编译后的内存镜像,线程安全。是生成Session的工厂,可以用在进程或集群的级别上,为事务之间可重用的数据提供二级缓存。 Session:应用程序与持久层的一次交互。非线程安全。生命周期短暂。是持久化对象的一级缓存。 Transaction:应用程序用来指定原子操作单元范围对象。抽象应用底层的JDBC、JTA、CORBA事务。,持久化对象和数据库映射,持久化实例状态: 瞬态(Transient):实例从未与持久化上下文(Session)关联过,没有持久化

4、标识(主键ID) 持久(Persistent):实例目前与Session关联,拥有持久化标识(主键ID),在数据库中可能有对应的一行记录 脱管(Detached):实例曾经与某个Session关联过,拥有持久化标识(主键ID),目前不与Session关联,在数据库中可能有对应的一行记录,在应用程序中,用来实现业务问题实体的类就是持久化类 持久化类举例:,每个持久化类要实现一个空参数的构造方法(可以不是public的),Hibernate用Constructor.newInstance()来实例化它们 每个持久化类都要提供一个标识属性,这个属性对应数据库的主键字段,类型可以是java的基本类型或

5、者是包装类型,如:,java.lang.String 代理是Hibernate的重要功能,要求持久化类不为final 若要把持久化对象放入Set集合中,为了标识对象,需要实现equals()和hashcode()方法,对象和关系数据库之间的映射用一个XML文件表示:,Hibernate的主配置参数,多数通过hibernate.cfg.xml配置 通过perties配置文件配置 通过编程的方式实现配置: Configuration cfg = new Configuration() cfg. addResource(“pm-meas-job.hbm.xml”); cfg

6、.addClass(MeasJob.class); cfg.setProperty(“hibernate.dialect”, “org.hibernate.dialect.Oracle9iDialect”); SessionFactory sf = cfg.buildSessionFactory();,集合类映射和关联映射,Hibernate要求持久化集合字段用接口声明,比如:java.util.Set, java.util.List, java.util.Map , java.util.sortedSet, java.util.sortedMap Hibernate在管理持久化对象时,会用自

7、己的实现来实现集合接口,用来实现LazyLoad机制 用于映射集合类的hibernate映射元素取决于接口的类型,总共有:, 以map映射的集合为例:, ,(1)name 集合属性的名称 (2)table (可选默认为属性的名称)这个集合表的名称(不能在一对多的关联关系中使用) (3)schema (可选) 表的schema的名称, 他将覆盖在根元素中定义的schema (4)lazy (可选-默认为true) 可以用来关闭延迟加载,指定一直使用预先抓取(对数组不适用) (5)inverse (可选默认为false) 标记这个集合作为双向关联关系中的方向一端。 (6)cascade (可选默认

8、为none) 让操作级联到子实体 (7)sort(可选)指定集合的排序顺序, 其可以为自然的(natural)或者给定一个用来比较的类。 (8)order-by (可选, 仅用于jdk1.4) 指定表的字段(一个或几个)再加上asc或者desc(可选), 定义Map,Set和Bag的迭代顺序 (9)where (可选) 指定任意的SQL where条件, 该条件将在重新载入或者删除这个集合时使用(当集合中的数据仅仅是所有可用数据的一个子集时这个条件非常有用) (10)fetch (可选, 默认为select) 用于在外连接抓取、通过后续select抓取和通过后续subselect抓取之间选择。

9、 (11)batch-size (可选, 默认为1) 指定通过延迟加载取得集合实例的批处理块大小(“batch size”)。 (12)access(可选-默认为属性property):Hibernate取得属性值时使用的策略 (13)乐观锁 (可选 - 默认为 true): 对集合的状态的改变会是否导致其所属的实体的版本增长。 (对一对多关联来说,关闭这个属性常常是有理的),索引集合类 除了set和bag语义外,都需要一个索引字段来保存对应集合的索引 (1)column(可选):保存集合索引值的字段名。 (2)formula (可选): 用于计算map关键字的SQL公式 (3)type (可

10、选,默认为整型integer):集合索引的类型。,值集合于多对多关联 用element元素把基本类型的集合映射成一张关系表 ,关联映射的种类 可以分为单向关联和双向关联 也可以分为ont-to-one, one-to-many, many-to-many三种关联 ont-to-one的关联有唯一外键关联和主键关联 one-to-many的关联是通过在两张数据库表间建立主外键关系 many-to-many的关联是通过一张关系表来保存两者之间关系的,继承映射,Hibernate支持三种基本的继承映射策略: 每个类分层结构一张表(table per class hierarchy) 每个子类一张表(

11、table per subclass) 每个具体类一张表(table per concrete class),每个类分层结构一张表(table per class hierarchy) 所有的父类和子类的字段存在一张表中,通过一个discriminator 字段标识类名,限制是不允许有not null的属性存在,每个子类一张表(table per subclass) 表的数量为父类和子类个数之和.三个子类表通过主键关联到超类表(因而关系模型实际上是一对一关联)。,每个具体类一张表(table per concrete class) 所有子类各一张表.每张表为对应类的所有属性(包括从超类继承的属

12、性)定义相应字段。,事务和并发,PO 即 Persistence Object VO 即 Value Object,TUser user = new TUser(); TUser anotherUser = new TUser(); user.setName(Emma); anotherUser.setName(Kevin); /此时user和anotherUser都是VO Transaction tx = session.beginTransaction(); session.save(user); /此时的user已经经过Hibernate的处理,成为一个PO /而anotherUser仍

13、然是个VO mit(); /事务提交之后,库表中已经插入一条用户”Emma”的记录 /对于anotherUser则无任何操作 Transaction tx = session.beginTransaction(); user.setName(Emma_1); /PO anotherUser.setName(Kevin_1);/VO mit(); /事务提交之后,PO的状态被固化到数据库中 /也就是说数据库中“Emma”的用户记录已经被更新为“Emma_1” /此时anotherUser仍然是个普通Java对象,它的属性更改不会 /对数据库产生任何影响 /由Hibernate返回的PO TUse

14、r user = (TUser)session.load(TUser.class,new Integer(1);,org.hibernate.Session和org.hibernate.Query的查用方法: Session.save() Session.update() Session.delete() Query query = session.createQuery(“select Alarm alarm where alarm.id=?”).setLong(0, 1L); query.list(); query.uniqueResult();,SessionFactory的创建代价很昂

15、贵,它线程安全,可以设计成被所有的应用程序线程共享.它只创建一次,通常是由应用程序启动的时候,由Configuration对象创建. Session对象是轻型的,非线程安全的,对单个工作单元而言,它只被使用一次,然后就丢弃. 数据库的事务应该尽可能的短.可以降低数据库锁定造成的资源争用.数据库长的事务会导致应用程序无法扩展到高的并发负载.,session-per-operation 不要因为一次简单的数据库调用,就打开和关闭一次Session!数据库事务也是如此 session-per-request 在这种模式下,来自客户端的请求被发送到服务器端(即Hibernate持久化层运行的地方),一

16、 个新的Hibernate Session被打开,并且执行这个操作单元中所有的数据库操作 长时间的操作带来的并发问题.用户在界面修改任务属性,过了5分钟才点确定,这段时间内如果别的用户也修改了这个任务,那么前者的修改就会被后者覆盖掉.,乐观并发控制(Optimistic concurrency control) 类似于CVS的实现方式,为每个对象和其对应的数据库表加入版本控制字段或时间戳.每次修改后都会修改版本控制字段自动增加.如果出现冲突,会主动抛出异常,提示后修改者已经有其他用户修改了该数据.有Hibernate程序来控制. 悲观锁定(Pessimistic Locking) 用户其实并不

17、需要花很多精力去担心锁定策略的问题,它利用了数据库实现的锁策略.,HQL(Hibernate Query Language)查询语句,HQL被设计为类似SQL的面向对象的查询语句.支持继承,多态. From子句: from MeasJob entity 返回MeasJob对应表的所有记录 关联(Association)与连接(Join) : select entity from MeasJob entity join entity.neMOMap nemo where nemo.id=5 Select子句 Select * from MeasJob entity 返回List Select e

18、ntity.stopTime, entity.startTime from MeasJob entity 返回List Select entity.jobName from MeasJob entity 返回String Select new list(entity.stopTime, entity.startTime) from MeasJob entity 返回List Select new JobTime(entity.stopTime, entity.startTime) from MeasJob entity 返回List(JobTime这个类要有相应的构造方法),支持聚集函数如:s

19、um() ,avg(), count(), min(), max() 支持多态查询: from AlarmRule entity where entity.id=5 (如果id是5的记录对应的类是AlarmRule的子类,则实际返回子类的实例) Where子句: 数学运算符+, -, *, / 二进制比较运算符=, =, , !=, like 逻辑运算符and, or, not ,in, not in, between, is null, is not null, is empty, is not empty, member of and not member of 简单的 case, cas

20、e . when . then . else . end,和 搜索 case, case when . then . else . end 字符串连接符.|. or concat(.,.) current_date(), current_time(), current_timestamp() second(.), minute(.), hour(.), day(.), month(.), year(.), EJB-QL 3.0定义的任何函数或操作:substring(), trim(), lower(), upper(), length(), locate(), abs(), sqrt(),

21、bit_length() coalesce() 和 nullif() cast(. as .), 其第二个参数是某Hibernate类型的名字,以及extract(. from .),只要ANSI cast() 和 extract() 被底层数据库支持 任何数据库支持的SQL标量函数,比如sign(), trunc(), rtrim(), sin() JDBC参数传入 ? 命名参数:name, :start_date, :x1 SQL 直接常量 foo, 69, 1970-01-01 10:00:01.0 Java public static final 类型的常量 eg.Color.TABB

22、Y 也支持order by子句 ,group by子句和子查询,条件查询(Criteria),org.hibernate.Criteria接口表示特定持久类的一个查询 List cats = session.createCriteria(Cat.class) .add( Restrictions.like(name, Fritz%) ) .add( Restrictions.between(weight, minWeight, maxWeight) ) .list(); 等同于select * from Cat cat where like Fritz% and cat.weight between minWeight and maxWeight List cats = session.createCriteria(Cat.class) .add( Restrictions.in( name, new String Fritz,Izi,Pk ) ) .add( Restrictions.disjunction() .add( Restrictions.isNull(age) ) .add( Restrictions.eq(age, new Integer(0) )

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论