Hibernate串讲.doc_第1页
Hibernate串讲.doc_第2页
Hibernate串讲.doc_第3页
Hibernate串讲.doc_第4页
Hibernate串讲.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

Hibernate一、 基础知识1、Hibernate是对象/关系映射(Object/Relation Mapping)的解决方案,是一个可以自动的根据xml配置文件来完成对象关系映射,并持久化到数据库的开源组件。get/set方法Serializable空构造方法2、Hibernate架构 POJO类 (plain old java object 普通Java类) hibernate.cfg.xml * .hbm.xml Hibernate应用 表结构需要导入:类库 lib: hibernate3.jar, Ojdbc14.jar等hibernate.cfg.xml配置文件设置重要的基础信息:连接数据库的驱动、用户名、密码,和映射文件路径等。4、Hibernate的优点: 不需要依赖容器、降低开发难度,减少代码量,开发周期比较快; 封装了JDBC,自动生成效率较高的SQL代码; 提供状态管理; 提供了一个面向对象的查询语言HQL。二、 几个重要的类 Configuration类 (负责管理Hibernate的配置信息)当创建SessionFactory时,Configuration实例可以指定使用哪一个映射文挡。应用程序通常只是创建一个Configuration实例,并通过它创建一个SessionFactory实例。 SessionFactory类 (负责创建Session实例)它是线程安全的,可以被多线程调用以取得Session,而且构造SessionFactory很消耗资源,所以多数情况下一个应用中只初始化一个SessionFactory,为不同的线程提供Session。 Session类 OO设计之前工作: 写好Pojo 建好表 配好xml文件Session是Hibernate运作的中心,对象的生命周期、事务的管理、数据库的存取都与Session息息相关。Session不是线程安全的,多个执行线程共享一个Session,将会发生数据共享而发生混乱问题。为了解决此问题,可以采用ThreadLocal变量,使用它可以有效隔离执行所使用的数据,也就避开了Session的多线程之间的数据共享问题。DB设计如何调用hibernate API?1、创建Configuration对象。(解析配置文件) Configuration config = new Configuration();2、通过Configuration创建Session Factory (线程安全的重量级组件)。 config = config.configure(); /configure()方法会在CLASSPATH下寻找hibernate.cfg.xml SessionFactory sessionFactory = config.buildSessionFactory(); /创建SessionFactory对象 3、通过SessionFactory创建Session会话对象。 Session session = sessionFactory.openSession(); /创建Session对象 4、通过Session取得事务对象。 Transaction trans session.beginTransaction(); /开始事务 5、通过session与数据库进行会话。 session.save(object o); /增 session.delete(object o); /删 session.update(object o); /改 session.get (Class clazz, Serializable id); /根据Id查找对象 session.createQuery(String sql); /自己拼HQL语言查找对象返回一个Query对象。 6、提交操作,结束事务。 Tmit(); 7、关闭Session session.close(); 注:第一步和第二步一般放在静态初始化代码块中执行。三、Hibernate中自带ID的generator的含义:1、identity:用于MySql数据库。特点:递增 注:对于MySql数据库使用递增序列时需要在建表时对主键指定为auto_increment属性。2、sequence:用于Oracle数据库 序列名 3、native:跨数据库时使用,由底层方言产生。遇Oracle采用sequence; 遇MySQL采用identity Default.sequence为hibernate_sequence 注:使用native时Hibernate默认会去查找Oracle中的hibernate_sequence序列。 如果Oracle中没有该序列,连Oracle数据库时会报错。4、hilo:通过高低位合成id,先建表hi_value,再建列next_value。必须要 有初始值。 high_val nextval 5 5、sequencehilo:同过高低位合成id,建一个sequence序列,不用建表。high_val_seq56、assigned:用户自定义id;7、foreign:用于一对一关系共享主健时,两id值一样。四、Hibernate类关系的处理:1、OnetoOne关系在数据库中如何体现,在JavaBean中如何体现,在Hibernate中如何映射onetoone关系。 1、数据库中:一个表的外健对应另一个表的主健,外健要加上Unique约束。或者是两个表共享一个主健。2、javaBean中:在JavaBean中增加一个属性,即另外一个对象的引用,可以单向也可以双向。3、在hibernate中:主健映射:都是onetoone 要用foreign生成策略。外健映射:主表中用onetoone,副表通过propertyref manytoonecreate table car_pk ( id number(10,0) not null, name varchar2(15), serial varchar2(30), manufacturer varchar2(50), producedate date, primary key (id);create table engine_pk ( id number(10,0) not null, model varchar2(20), manufacturer varchar2(50), producedate date, primary key (id);alter table engine_pk add constraint fk_engine_car_pk foreign key (id) references car_pk(id);One-to-One PK主键映射 (详见代码)Table car_pkIdnameserialmanufacturer producedateTable engine_pkIdmodelmanufacturer producedate特点:engine_pk 表的Id 与 car_pk表共享主键。 One-to-One FK外键映射 (详见代码)Table car_pkIdnameserialmanufacturer producedateTable engine_fkIdcaridmodel manufacturer producedate特点:engine_fk表多了carid外键字段来维护与car_fk 表的关系。建表语句如下:create table engine_fk ( id number(10,0) not null, model varchar2(20) not null, manufacturer varchar2(50) not null, producedate date, carid number(10,0) unique, primary key (id);alter table engine_fk add constraint fk_engine_car_fk foreign key (carid) references car_fk(id);2、ManytoOne关系在数据库中如何体现,在JavaBean中如何体现,在Hibernate中如何映射manytoon关系。1、数据库中:一个表的主健对应另一个表的外健。2、javaBean中:一个对象包含另一个对象的一个引用,另一个对象包含这个对象的一组(集合,用set)引用。3、在hibernate中:用set.key指定具体列。 在Set一端一定要写inverse“true”表示忽略集合一端的变化。以Order类和Item类 的一对多关系为例子(详见代码): Item-id: Integer-product: String-amount: int-order: Order- Order-id: Integer-owner: String-phone: String-address: String-items: Set 1 *小结: 对象的关联关系有一对一、一对多、多对一和多对多,其中多对一和一对多关系比较常见。一对一关系有两中方式:以主键关联和以外键关联。 一对多和多对一通常应设置为双向关联,并在“一”这一方设置inverse=true(比如一个班级对应多个学生,在班级这一边设置inverse=true)。设置了inverse=true这一端比较清闲,它把控制权交给了另一端。让“多”这一端有控制权。 多对多 可以借助中间表来保存两个实体之间的关系。五、对象在Hibernate中的状态.对象在Hibernate中的状态图: 对象3种状态: Transient(瞬时/临时) Persistent(持久) Detached(脱管/游离)new临时状态garbegeget()load()find()iterate()etc.save()saveOrUpdate()delete()持久化状态update()saveOrUpdatelock()evict()close()*clear()*garbege游离状态瞬时状态(Transient): 在内存中刚刚创建的对象,还没有同步到数据库,如果没有变量对它进行引用,它将被JVM回收。或者是数据库中信息被删除了的对象也是临时状态。 特点- 不和Session实例关联; 在数据库中没有和瞬时对象关联的记录。持久化状态(Persistent): 持久的实例在数据库中有对应的记录,并拥有一个持久化标识(identifier)。持久的事例可能是刚被保存的,或刚被加载的,无论哪一种,按定义对象都仅在相关联的Session生命周期内保持这种状态。而且持久对象也与Transaction相关联,必须在Transaction终止,也就是执行commit()之后,持久对象的状态才会与数据库进行同步。 特点- 和Session实例关联; 在数据库中有和持久对象关联的记录。游离状态(Detached): 与持久对象关联的Session被关闭后,对象就变为游离的。对游离对象的引用依然有效,对象可以被继续修改。游离对象如果重新关联到某个新的Session上,会再次转变为持久的(注:这样游离状态期间的改动会持久化到数据库中)。 特点- 本质上和瞬时对象相同 只是比瞬时对象多了一个数据库记录标识值id六、HQL(Hibernate Query Language) HQL是面向对象的查询语言,它的语法和SQL有些相似,在运行时才得以解析。 注意:HQL是面向对象的,不要在语句中有表的概念存在。1最简单的查询: 查询所有的Student对象: from Student 或 select s from Student s 除了Java类与属性名称外,查询语句大小写不敏感。2属性查询: 有时不希望得到对象所有属性,则: Query query = session.createQuery(“select from Student s”); List list = query.list(); for(int i=0; ilist.size(); i+) String name = (String)list.get(i); System.out.println(name); 若 “select , s.age from Student as s” 则查询结果会以数组形式返回。 Object obj = (Object) list.get(i);3实例化查询 是对属性查询的一种改进。将Object中的所有成员封装成一个对象: Query query = session.createQuery(“select new Student(, s.age) from Student s”) List list = query.list(); for(int i=0; i=20”); 查询所有学生年龄不小于21岁的班级对象 From Team t where 21all (select s.age from t.students s)注意:MySQL从4.1x版本才支持子查询,以前的版本中可用连接查询和分组查询取代。七、Hibernate控制的事务事务保证原子操作的不可分,也就是操作的同时成功或同时失败。Transaction tran=session.beginTranaction();mit();tran.rollback();以上是事务对象的方法,来实现对事务的支持。hibernate的事务隔离级别:hibernate的事务隔离级别和JDBC中大致相同。设置时要在hibernate.cfg.xml配置41,读未提交的数据(Read uncommitted isolation)2,读已提交的数据(Read committed isolation)4,可重复读级别(Repeatable read isolation)8,可串行化级别(Serializable isolation)八、Hibernate的锁(悲观锁,乐观锁)悲观锁是由数据库本身所实现的,会对数据库中的数据进行锁定,也就是锁行。LockMode.UPGRADE 修改锁,在get()方法中加上这个设置作为第三个参数。LockMode.NONE 无锁机制LockMode.READ 读取锁LockMode.WRITE 写入锁,不能在程序中直接使用还可以使用Session.lock() Query.setLockMode() Criteria.setLockMode()方法来设置锁乐观锁,也就是通过对记录加上某些信息来解决并发访问的问题。版本检查要在其表中多加上一列表示版本信息,会在读取时读到这个版本号,并在修改之后更新这个版本号,并且只有版本号相同才会予以更新,

温馨提示

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

评论

0/150

提交评论