hibernate 知识点归纳_第1页
hibernate 知识点归纳_第2页
hibernate 知识点归纳_第3页
hibernate 知识点归纳_第4页
hibernate 知识点归纳_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

hibernate 知识点归纳 lichaotarena. Hibernate 一、Hibernate的简介hibernate数据持久化组件对象持久化(Object Persistence):把数据保存在永久存储介质中(数据库) 1、为什么要持久化:a.内存是暂时存储设备,断电后数据易丢失b.网络传输无法传输内存中的对象,需要将对象外化c.内存中数据查询,组织不方便d.内存只能存储少量数据 2、怎样持久化a.对象序列化-二进制流合并存储,粒度大,无规律,不支持检索,只适合少数个别对象的序列化b.用JDBC/EJB/ORM将数据存入数据库用JDBC:(Java DBConnection)优点:底层开发,控制力强(细);效率最高;标准的(SQL)JDBC,有可移植性缺点:过于复杂;代码量大;可维护性差(代码重用性低);用EJB:(Entity Java Bean)优点:直接自动生成JDBC代码;持久对象(PO)的状态由服务器管理;声明式的事务缺点:功能不全(特殊的组件,不能做继承关系);EJB容器是侵入性容器,失去OO的优点;调试更复杂用ORM:(object relationmapping)对象关系映射优点:自动生成JDBC(代码量下降);使用(plain oldestjava object-pojo),非侵入型;提供状态管理;难度下降,不需要容器缺点:由于开源,文档少;bug多;技术支持差结论:用java开发-必须将数据持久化-用数据库持久化-须用ORM-需要用Hibernate 二、Hibernate编程步骤POJO类plain oldestjava object,就是标准的JavaBean。 e Hibernate Hibernate-一个可以自动的根据xml完成对象关系映射,并持久化到数据库的开源组件。 其底层也是由JDBC实现的。 hibernate是通过xml文件的配置,对数据库的底层的方言,以及数据库连接所需的信息,以及连接数据库的驱动。 1lichaotarena. hibernate的系统配置文件hibernate.cfg.xml-与数据库建立连接(一般放在项目的根目录下)XXXX.hbm.xml-用来建立类与表之间的映射关系(一般将映射类的xml文件和实体类放在一起)Hibernate一些API Configuragion读配置文件(默认名:hibernate.cfg.xml)SessionFactory:重量级的对象,线程安全的Session它相当于JDBC中的Connection(org.hibernate.Session),轻量级的对象,线程不安全(原则上一个线程一个Session,一个事物一个Session不要放在并发的环境中)。 Transaction管理事务的对象(org.hibernate.Transaction)Query查询对象,提供面向对象的查询语言(HQL)hibernate编程步骤1,配置环境,加载hibernate的jar文件,以及连接数据库连接使用的jar文件,并配置CLASSPATH环境变量。 2,写hibernate所需的配置文件,hibernate.cfg.xml,XXX.hbm.xml3,写POJO类4,调用hibernate API。 1)使用Configuration对象的buildSessionFactory()方法创建SessionFactory对象2)使用SessionFactory对象openSession()方法创建Session对象。 3)使用Session的相应方法来操作数据库,将对象信息持久化到数据库。 5.HQL语句Query q=s.createQuery(from Aountwhere actNo=:actNo);/from类名where属性名=:shuxingming q.setLong(actNo,12345);/设置属性名,并赋值q.uniqueResult()/获得匹配HQL的唯一属性附:1.环境配置:a.类库*导入hibernate库文件* 1、在eclipse中建立一个java工程,如:hbn 2、在工程hbn的属性-Build Path中选择Add Libraries 3、在Add Libraries窗口中选择User Library点next按钮 4、在User Library窗口中点User Libraries.按钮 5、在User Libraries窗口中,点new按钮2lichaotarena. 6、在New userlibrary窗口中,填写一个User libaryname(如:hbnlib,注意不要选择System libary复选框),点OK按钮回到User Liberies窗口 7、在User Liberaries窗口中选择刚刚创建的hbnlib,点Add jars按钮 8、在打开的文件选择窗口中找到解压好的hibernate的库文件,全部选中,点打开按钮,返回User Libraries窗口 9、在User Libraries窗口中点OK按钮,返回User Library窗口;再点Finish按钮,结束操作b.驱动c.映射文件/配置文件的模板d.Eclips导入2个DTD文件*导入hibernate库文件* 1、在eclipse中建立一个java工程,如:hbn 2、在工程hbn的属性-Build Path中选择Add Libraries 3、在Add Libraries窗口中选择User Library点next按钮 4、在User Library窗口中点User Libraries.按钮 5、在User Libraries窗口中,点new按钮 6、在New userlibrary窗口中,填写一个User libaryname(如:hbnlib,注意不要选择System libary复选框),点OK按钮回到User Liberies窗口 7、在User Liberaries窗口中选择刚刚创建的hbnlib,点Add jars按钮 8、在打开的文件选择窗口中找到解压好的hibernate的库文件,全部选中,点打开按钮,返回User Libraries窗口 9、在User Libraries窗口中点OK按钮,返回User Library窗口;再点Finish按钮,结束操作Hibernate 三、的状态管理Transient暂时(瞬时)状态:po和Session无关,数据库中也无该记录由new命令开辟内存空间的java对象,eg.Person person=new Person(Lisa,女);如果没有变量对该对象进行引用,它将被java虚拟机回收.瞬时对象在内存孤立存在,它是携带信息的载体,不和数据库的数据有任何关联关系,在Hibernate中,可通过session的save()或saveOrUpdate()方法将瞬时对象与数据库相关联,并将数据对应的插入数据库中,此时该瞬时对象转变成持久化对象.Persistent持久(受管)状态:po和Session有关,数据库中有该记录3lichaotarena.处于该状态的对象在数据库中具有对应的记录,并拥有一个持久化标识.如果是用hibernate的delete()方法,对应的持久对象就变成瞬时对象,因数据库中的对应数据已被删除,该对象不再与数据库的记录关联.当一个session执行close()或clear()、evict()之后,持久对象变成脱管对象,此时持久对象会变成脱管对象,此时该对象虽然具有数据库识别值,但它已不在HIbernate持久层的管理之下.Detached游离(脱管)状态:po和某个Session无关,数据库中有该记录当与某持久对象关联的session被关闭后,该持久对象转变为脱管对象.当脱管对象被重新关联到某个session上时,并再次转变成持久对象.脱管对象拥有数据库的识别值,可通过update()、saveOrUpdate()等方法,转变成持久对象.Hibernate三种状态之间的转换关系new()对象-临时状态-saveOrUpdate()|+|save()|persit()|merge()|delete()|createQuery()|get()|-+|+|load()持久化状态垃圾回收|list()|+|uniqueResult()|evict()|update()|close()|saveOrUpdate()|clear()|lock(),merge()|+|-游离状态注 1、persist()把一个瞬态的实例持久化,但是并不保证标识符被立刻填入到持久化实例中,标识符的填入可能被推迟到flush的时间。 2、merge()如果idertifier(以下简称为id)为空或不存在,则进行insert动作如果id存在,则进行update动作4lichaotarena. 3、lock()是把一个没有更改过的脱管状态的对象变成持久状态对应更改一个记录的内容,需要等待flush()的操作 4、clear()清除缓存中全部的对象,但是不包括正在操作的对象。 5、evict()会把指定的缓冲对象进行清除 6、load()会首先在缓存中找,如果没有也不会到数据库中找,返回代理对象。 缓存中有返回真对象,缓存中没有返回假的对象,如果不用此对象,就结束;如果用就真的去数据库中找,如果数据库有返回真的,没有就抛出异常。 里面存在一个延迟加载的概念,为了提高查询效率。 load()不管怎么都会返回值,但是找不到会抛出对象未找到异常。 7、get()没有延迟加载概念,也会首先在缓存中找,如果有返回,如果没有就直接去数据库有,有返回该对象,没有返回NULL。 8、flush()执行的时机 1、当提交是会有一个隐含的flush() 2、直接显式的调用flush()方法 3、某些查询之前隐含执行flush() 五、Hibernate的基数映射基于外键的双向一对一5lichaotarena.基于主键的双向一对一student双向一对多6lichaotarena.双向多对多name=Studenttable=t_student_double_many2many7lichaotarena.注更多的照基数映射关系参照hibernate.zip码。 压缩包下的示例代码。 六、e Hibernate的小知识点 1、级联操作cascade cascade属性是设置级联操作的也就是在操作一端的数据如果影响到多端数据时会进行级联操作.1.none:就是只对本对象进行操作,不使用级联操作,默认级联是none。 2.save-update:也就是只有对象保存操作(持久化操作)或者是持久化对象的更新操作,才会级联操作关联对象(子对象),one2many关系中多的那一方可能会使用;3.delete:对持久化对象的删除操作时会进行级联操作关联对象(子对象)。 4.all:对持久化对象的所有操作都会级联操作关联对象(子对象)。 5.all,elete-orphan:在多端进行删除操作时,会在多端表中留下null空纪录,设置了级联操作为delete之会将表中表示关联的外键id置成null,不会将这条纪录也删除掉,而把级联设置成delete-orphan就不会留有空纪录,而是级联的把相关纪录删除掉。 (级别最深) 2、inverse它与cascade是两个完全不同的概念,但是两者总是联合使用。 inverse=true就是在设置如果在内存中的修改或添加了这个集合中的某一个或某几个对象,他不会将全部集合的信息同步到数据库,而是只将集合中被修改的对象重新同步到数据库,也就是交给谁来维护关系(维护关系就是维护外键) 3、lazy延迟加载有对象延迟加载(使用load()方法)、集合的延迟加载(Hibernate默认集合延迟加载)lazy=“true”延迟加载,所谓的延迟加载,就是对一端的集合属性的加载策略,就是在不使用到集合中的对象的数据就不会真正的加载集合中的对象数据,而是加在一8lichaotarena.个代理对象就相当于的一个空的容器。 这也就是会出LazyInitializationException异常,也就是没有初始化这个代理的集合对象,在事先查询到了集合中的对象就会初始化这个对象,如果Session没有关闭就会在查询加载集合中的对象信息,如果提前关闭了Session,当使用集合中的对象信息时就会有这个异常。 我们可以使用几种方式来实现立即加载 1、配置lazy=“false” 2、调用Hibernate.initialize()方法装载 3、使用String hql=“from Useru joinfetch u.ats whereu.uid=?”;补充-次运行告时显示的红色警告org.apache.mons.logging.Log,System.setProperty(o rg.apache.mons.logging.Log,he.mons.logging.impl.NoOpLogorg.apach);e.mons.logging.impl.NoOpLog); 七、继承映射所有类一张表9lichaotarena.每个类一张表10lichaotarena.每个子类一张表11lichaotarena. 八、组件-集合映射12lichaotarena. 九、集合映射Set集合(无序、不能重复)List集合(有序、可重复)13lichaotarena.Map集合(Key、可以重复、value不能重复)Bug集合(介于Set和List之间,是Hibernate,模拟的类型,无序、可重复)14lichaotarena. 十、e Hibernate控制的事务hibernate的事务隔离级别和JDBC中大致相同。 设置时要在hibernate.cfg.xml配置21,读未提交的数据(Read unmittedisolation)2,读已提交的数据(Read mittedisolation)4,可重复读级别(Repeatable readisolation)8,可串行化级别(Serializable isolation) (1)锁物理上只有一种锁,就是数据库的锁;写的时候一瞬间一定是锁住的;不能取消;悲观锁和乐观锁是衍生的概念,用来解决并发的;悲观锁读回来的时候就锁住了,在它提交之前别人不能修改这条记录;就是它肯定这个期间一定有人来修改这条记录;乐观锁读回来的时候不加锁,就是它肯定期间不会有人来修改这条记录;但是别人可以修改这条记录;加一个vresion字段;读取的时候把version也读回来,更新的时候看version是否一致,一致的时候更新,并将versin加1存回去; (2)乐观锁:JDBC中version都需要自己维护;而Hibernate帮我们维护;update table_test x=?,y=?where version=1;1)版本检查要在其表中多加上一列表示版本信息,会在读取时读到这个版本号,并在修改之后更新这个版本号,并且只有版本号相同才会予以更新,如果版本号低于数

温馨提示

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

评论

0/150

提交评论