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

下载本文档

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

文档简介

Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任。 Hibernate的核心接口一共有5个,分别为:Session、SessionFactory、Transaction、Query和Configuration.这5个核心接口在任何开发中都会用到。通过这些接口,不仅可以对持久化对象进行存取,还能够进行事务控制。下面对这五的核心接口分别加以介绍。 Session接口:Session接口负责执行被持久化对象的CRUD操作(CRUD的任务是完成与数据库的交流,包含了很多常见的SQL语句。)。但需要注意的是Session对象是非线程安全的。同时,Hibernate的session不同于JSP应用中的HttpSession.这里当使用session这个术语时,其实指的是Hibernate中的session,而以后会将HttpSesion对象称为用户session. SessionFactory接口:SessionFactroy接口负责初始化Hibernate.它充当数据存储源的代理,并负责创建Session对象。这里用到了工厂模式。需要注意的是SessionFactory并不是轻量级的,因为一般情况下,一个项目通常只需要一个SessionFactory就够,当需要操作多个数据库时,可以为每个数据库指定一个SessionFactory. Configuration接口:Configuration接口负责配置并启动Hibernate,创建SessionFactory对象。在Hibernate的启动的过程中,Configuration类的实例首先定位映射文档位置、读取配置,然后创建SessionFactory Transaction接口:Transaction接口负责事务相关的操作。它是可选的,开发人员也可以设计编写自己的底层事务处理代码。 Query和Criteria接口:Query和Criteria接口负责执行各种数据库查询。它可以使用HQL语言或SQL语句两种表达方式。一般场合: 针对某一对象(单个对象)简单的查改删增,不是批量修改、删除,适合用Hibernate; 而对于批量修改、删除,不适合用Hibernate,这也是OR框架的弱点; 要使用数据库的特定优化机制的时候,不适合用Hibernate 2.hibernate的工作原理 1.配置好hibernate的配置文件和与类对应的配置文件后,启动服务器(在进行Hibernate开发之前,需要首先获得Hibernate类库、相应数据库的JDBC驱动类库。Hibernate类库可以从中下载,目前的版本是3.0.而JDBC驱动可以根据不同的数据库来选择,在这个例子中,使用的是Oracle数据库,那么相应的JDBC驱动可以从Oracle安装目录ora92jdbc下获得。其他的数据库请根据相关的说明获得。下载Hibernate包后,可以将它解压到一个文件夹,此处假设为C:hibernate-3.0,然后将C:hibernate-3.0下的hibernate.jar和C:hibernate-3.0lib下的那些第三方类库也放到环境变量CLASSPATH中。(通常,只需要dom4j、cglig、commons-logging、commons-collections、log4j、ehcache、asm、jta、antlr这些类库就可以了)我们需要一个hibernate.cfg.xml或者属性文件perties来指定Hibernate所使用的数据库以及用户名、密码等其他相关的配置,我们在此使用xml文件,它的内容如下:源文件:hibernate.cfg.xmltrueorg.hibernate.dialect.Oracle9Dialectoracle.jdbc.driver.OracleDriverjdbc:oracle:thin:localhost:1521:nitprosystemmanager)2.服务器通过实例化Configeration对象,读取hibernate.cfg.xml文件的配置内容,并根据相关的需求建好表或者和表建立好映射关系3.通过实例化的Configeration对象就可以建立sessionFactory实例,进一步,通过sessionFactory实例可以创建session对象4.得到session之后,便可以对数据库进行增删改查操作了,除了比较复杂的全文搜索外,简单的操作都可以通过hibernate封装好的session内置方法来实现5.此外,还可以通过事物管理,表的关联来实现较为复杂的数据库设计优点:hibernate相当于java类和数据库表之间沟通的桥梁,通过这座桥我们就可以做很多事情了 首先,我们需要定义一个用于表示“学生”对象的Student类:源文件:Student.javapublic class Student private int student_id; private String student_name; private int student_age; public int getStudent_id() return student_id; public String getStudent_name() return student_name; public int getStudent_age() return student_age; public void setStudent_id(int id) this.student_id = id; public void setStudent_name(String name) this.student_name = name; public void setStudent_age(int age) this.student_age = age; 这个类很简单,就是一个典型的JavaBean的定义:有三个属性:student_id、student_name和student_age,分别对应数据库表Student中的三个字段,并且在这个类中定义了对应各个属性的setter/getter方法。 接下来,我们需要给这个类定义一个XML映射文件“Student.hbm.xml”,文件内容如下:源文件:Student.hbm.xml student_sequence = Represents a single playable track in the music database. author Jim Elliot(with help from Hibernate) protected Playing time When the track was created How loud to play the track 说明如下:1.用于导言说明,说明它的文件格式定义。2.标签里是真正的映射。3.定义一个类com.oreilly.hh.Track的映射。(可以定义任意多个类在一个映射文件里)。表示存在数据库表TRACK中。4. Represents a single playable track in the music database. author Jim Elliot(with help from Hibernate) 定义了说明,可以被JavaDoc读取。5. protected 定义了类属性和数据库表列的映射。 是表示ID生成策略,此种策略有多种。6. How loud to play the track 定义了说明,可以被JavaDoc读取。Hibernate 的初始化. 读取Hibernate 的配置信息-创建Session Factory 1)创建Configeration类的实例。 它的构造方法:将配置信息(Hibernate config.xml)读入到内存。 一个Configeration 实例代表Hibernate 所有Java类到Sql数据库映射的集合。 2)创建SessionFactory实例 把Configeration 对象中的所有配置信息拷贝到SessionFactory的缓存中。 SessionFactory的实例代表一个数据库存储员源,创建后不再与Configeration 对象关联。 缓存(cache):指Java对象的属性(通常是一些集合类型的属性占用内存空间。 SessionFactory的缓存中:Hibernate 配置信息。OR映射元数据。 缓存大:重量级对象 小:轻量级对象 3)调用SessionFactory创建Session的方法 1】用户自行提供JDBC连接。 Connection con=dataSource.getConnection(); Session s=sessionFactory.openSession(con); 2】让SessionFactory提供连接 Session s=sessionFactory.openSession(); 4)通过Session 接口提供的各种方法来操纵数据库访问。 Hibernate 的缓存体系 一级缓存: Session 有一个内置的缓存,其中存放了被当前工作单元加载的对象。 每个Session 都有自己独立的缓存,且只能被当前工作单元访问。 二级缓存: SessionFactory的外置的可插拔的缓存插件。其中的数据可被多个Session共享访问。 SessionFactory的内置缓存:存放了映射元数据,预定义的Sql语句。 Hibernate 中Java对象的状态 1.临时状态 (transient) 特征: 1】不处于Session 缓存中 2】数据库中没有对象记录 Java如何进入临时状态 1】通过new语句刚创建一个对象时 2】当调用Session 的delete()方法,从Session 缓存中删除一个对象时。 2.持久化状态(persisted) 特征: 1】处于Session 缓存中 2】持久化对象数据库中设有对象记录 3】Session 在特定时刻会保持二者同步 Java如何进入持久化状态 1】Session 的save()把临时持久化状态 2】Session 的load(),get()方法返回的对象 3】Session 的find()返回的list集合中存放的对象 4】Session 的update(),saveOrupdate()使游离持久化 3.游离状态(detached) 特征: 1】不再位于Session 缓存中 2】游离对象由持久化状态转变而来,数据库中可能还有对应记录。 Java如何进入持久化状态游离状态 1】Session 的close()方法 2】Session 的evict()方法,从缓存中删除一个对象。提高性能。少用。2.异常的种类普通异常和运行异常的区别运行时异常是系统运行时发出的异常,程序员控制不了的,这类异常不需要try,catch和throws exception语句,是由java虚拟机抛出的,并且自动捕获抛出的main方法 中,我们 不能对这个异常进行处理,它会直接终止程序。一般遇到的就是空指针异常,数组越界异常等,这些异常一般是我们可以在前台控制台可以看到的,相信你也看到过吧。 受检测异 常指的就是我们可以处理的异常,我们可以通过try catch语句捕获并且处理(也可以不处理直接向上层抛出),处理之后程序还可以继续执行,不会终止程序,如果每一 层都每一 处理,则会终止程序。4.hibernate的缓存机制一级缓存 指的是session(对数据进行增删查改)二级缓存 值的是sessionfactory,对一些数据库进行变化的时候 主要是为了减少资源浪费,对一些不经常改变的数据进行缓存,select * from 这种的语句就是为了减少无谓的浪费资源Hibernate关系映射是1对1one-to-one。 1对1的关系在现实中很常见。比方说:人和身份证。1个身份证对应着一个身份证,一个身份证对应着一个人。那么,我们就以此为原型。进行代码编写。 建立实体模型如右: 根据模型,创建数据库: useHibernateQuickUse;droptableifexistsPerson;droptableifexistsCard;createtableCard(idvarchar(32)primarykey,cardDescvarchar(128)notnull);createtablePerson(idvarchar(32)primarykey,namevarchar(32)notnull,card_idvarchar(32)notnull,foreignkey(card_id)referencesCard(id); Java代码如下: Person类 packageorg.py.hib.relation.one2one;/*Personentity.*/SuppressWarnings(serial)publicclassPersonimplementsjava.io.SerializableprivateStringid;privateStringname;privateCardcard;publicPerson()publicStringgetId()returnthis.id;publicvoidsetId(Stringid)this.id=id;publicCardgetCard()returnthis.card;publicvoidsetCard(Cardcard)this.card=card;publicStringgetName();publicvoidsetName(Stringname)=name; Card类: packageorg.py.hib.relation.one2one;/*Cardentity.*/SuppressWarnings(serial)publicclassCardimplementsjava.io.SerializableprivateStringid;privateStringcardDesc;publicCard()publicStringgetId()returnthis.id;publicvoidsetId(Stringid)this.id=id;publicStringgetCardDesc()returncardDesc;publicvoidsetCardDesc(StringcardDesc)this.cardDesc=cardDesc; XML映射文件如下: Person.hbm.xml /hibernate-mapping-3.0.dtdcascade=allcolumn=card_id/ 今天讲的是one-to-one配置。但是,此处用的是many-to-one,这个是什么原因呢?其实,one-to-one就是特殊的many-to-one。 Card.hbm.xml: /hibernate-mapping-3.0.dtd测试代码如下: One2OneTest.java packageorg.py.hib.relation.one2one;importjunit.framework.Assert;importjunit.framework.TestCase;importorg.hibernate.Session;importorg.hibernate.SessionFactory;importorg.hibernate.Transaction;importorg.hibernate.cfg.Configuration;importorg.junit.After;importorg.junit.Before;publicclassOne2OneTestextendsTestCaseprivateSessionFactoryfactory;privateStringm_name=ryanpoy;privateStringm_name2=ryanpoy2;privateStringm_cardDesc1=desc_1;privateStringm_cardDesc2=desc_2;BeforepublicvoidsetUp()throwsExceptionConfigurationconf=newConfiguration().configure();factory=conf.buildSessionFactory();/*测试添加*throwsException*/publicvoidtestSave()throwsExceptionSystem.out.println(n=testsave=);Cardcard=newCard();card.setCardDesc(m_cardDesc1);Personperson=newPerson();person.setName(m_name);/设置用户名=m_nameperson.setCard(card);Sessionsession=null;Transactiontran=null;trysession=factory.openSession();tran=session.beginTransaction();session.save(person);mit();Assert.assertEquals(person.getId()!=null,true);Assert.assertEquals(card.getId()!=null,true);catch(Exceptionex)tran.rollback();throwex;finallyif(session!=null)trysession.close();catch(Exceptionex)/nothingtodofinallyif(session!=null)session=null;/*测试查询*throwsException*/publicvoidtestFind()throwsExceptionSystem.out.println(n=testfind=);Sessionsession=null;trysession=factory.openSession();Personperson=(Person)session.createQuery(fromPerson).list().get(0);Assert.assertEquals(true,person.getId()!=null);Assert.assertEquals(m_name,person.getName();Assert.assertEquals(true,person.getCard().getId()!=null);Assert.assertEquals(m_cardDesc1,person.getCard().getCardDesc();catch(Exceptionex)throwex;finallyif(session!=null)trysession.close();catch(Exceptionex)/nothingtodofinallyif(session!=null)session=null;/*测试修改*throwsException*/publicvoidtestModify()throwsExceptionSystem.out.println(n=testmodify=);Sessionsession=null;Transactiontran=null;trysession=factory.openSession();tran=session.beginTransaction();Personperson=(Person)session.createQuery(fromPerson).list().get(0);person.setName(m_name2);/修改用户名=m_name2.(原来用户名=m_name)person.getCard().setCardDesc(m_cardDesc2);/修改cardDesc为m_cardDesc2(原来是:m_cardDesc1)mit();catch(Exceptionex)throwex;finallyif(session!=null)trysession.close();catch(Exceptionex)/nothingtodofinallyif(session!=null)session=null;/*修改后再查询*/System.out.println(n=testfindaftermodify=);trysession=factory.openSession();Personperson=(Person)session.createQuery(fromPerson).list().get(0);Assert.assertEquals(true,person.getId()!=null);Assert.assertEquals(m_name2,person.getName();Assert.assertEquals(true,person.getCard().getId()!=null);Assert.assertEquals(m_cardDesc2,person.getCard().getCardDesc();catch(Exceptionex)throwex;finallyif(session!=null)trysession.close();catch(Exceptionex)/nothingtodofinallyif(session!=null)session=null;/*测试删除*throwsException*/publicvoidtestDelete()throwsExceptionSystem.out.println(n=testdelete=);Sessionsession=null;Transactiontran=null;trysession=factory.openSession();tran=session.beginTransaction();Personperson=(Person)session.createQuery(fromPerson).list().get(0);session.delete(person);mit();catch(Exceptionex)throwex;finallyif(session!=null)trysession.close();catch(Exceptionex)/nothingtodofinallyif(session!=null)session=null;/*删除后再查询*/System.out.println(n=testfindafterdelete=);trysession=factory.openSession();Integernum=(Integer)session.createQuery(fromPerson).list().size();Assert.assertEquals(0,Value();num=(Integer)session.createQuery(fromCard).list().size();Assert.assertEquals(0,Value();catch(Exceptionex)throwex;finallyif(session!=null)trysession.close();catch(Exceptionex)/nothingtodofinallyif(session!=null)session=null;/*/AfterpublicvoidtearDown()throwsExceptionfactory.close(); 运行test,测试成功. 在Hibernateone-to-one关系映射中,其实还有一种方式,即:唯一主见关联。但是,我一直倾向于上面的这种形式,所以,唯一主见关联的旧部介绍了。Hibernate源码中几个包的作用简要介绍 net.sf.hibernate.* 该包的类基本上都是接口类和异常类 net.sf.hibernate.cache.* JCS的实现类 net.sf.hibernate.cfg.* 配置文件读取类 net.sf.hibernate.collection.* Hibernate集合接口实现类,例如List,Set,Bag等等,Hibernate之所以要自行编写集合接口实现类是为了支持lazy loading net.sf.hibernate.connection.* 几个数据库连接池的Prov

温馨提示

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

评论

0/150

提交评论