hibernate如何优化的授课笔记_第1页
hibernate如何优化的授课笔记_第2页
hibernate如何优化的授课笔记_第3页
hibernate如何优化的授课笔记_第4页
hibernate如何优化的授课笔记_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

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

文档简介

hibernate优化笔记hibernate优化讲课步骤:1.即时加载: 默认为true,代表加载延时加载策略,当改为false时代表不启用延时加载策略. 在hibernate2中默认为false,但在hibernate3中默认为ture, 在查询中,用对象才查询.2.延迟加载: 演示对对象的查询,在用对象的时候,才执行操作! 演示对子表的操作,在用对象的时候,才执行操作!(one-to-many父表多条记录) 推荐:对常用字段做lazy=false,集合对象使用lazy=true;3.预先加载: 演示out-join4.批量加载: 演示查询子父表,不用批量加载是1+n的关系!用批量加载是1+1的关系! 在one-to-many中!循环读取子表内容时使用. batch-size="5":不推荐使用非常大的值! select*fromtablewhereid=1; select*fromtablewhereid=2; 转换为 select*fromtablewhereid=1orid=2;5.List和Iterator6.inverse:默认为false,默认为关联更新; inverse:默认为false!所以inverse属性默认会进行“关联更新”。 inverse=false————反映;inverse=true————不反映” 当inverse在主表时,inverse为false时! 先执行insert主,再insert子,然后再update子! 当inverse在主表时,inverse为true时! 先执行insert主,再insert子. 只对set+many-to-many设置inverse=false,其他的inverse=false。 糟糕的是,不设置inverse属性时,inverse默认为false。 在一对多关系中inverse就更有意义了。在多对多中,在哪端inverse="true"效果差不多(在效率上)。但是在一对多中,如果要一方维护关系,就会使在插入或是删除"一"方时去update"多"方的每一个与这个"一"的对象有关系的对象。而如果让"多"方面维护关系时就不会有update操作,因为关系就是在多方的对象中的,直指插入或是删除多方对象就行了。让"多"方维护关系更直观一些。 DEMOSHOW: 1.inverse="false" 主对象包含子对象! Useru=newUser(); Messagemessage=newMessage(); u.getMessages().add(message); session.save(u); sql语句回滚,因为调用了,一条都没有进去! updatemessagesetUSER_ID=?whereid=? (即便加入message.setUser(u),但是仍然回滚!) 2.inverse="true" 同上,主控方在从。顺利插入user对象! 会比false少一条sql语句! 如果上面还不懂: 2.5 one-to-many的关系! inverse="false" Useru=newUser(); session.update(u); 结果 Hibernate:updateusersetuserName=?,passWord=?whereid=? Hibernate:updatemessagesetUSER_ID=nullwhereUSER_ID=? 2条sql语句,对父表做的任何动作,都会更新到子表中去! inverse="true" Useru=newUser(); session.update(u); 只有一条sql语句,正常! 3.但是(之前都是没有加cascade="save-update"的情况!) Useru=newUser(); Messagemessage=newMessage(); u.getMessages().add(message); message.setUser(u);//即便加入这句话! session.save(u); 代码仍然不能插入message!只插入了user对象! 因为你save的是user对象!除非加入casecade="save-update"才会加入message对象!7.cascade:默认为none; 级联(cascade)属性的作用: 只有“关系标记”才有cascade属性:many-to-one,one-to-one,any, set(map,bag,idbag,list,array)+one-to-many(many-to-many) all:所有情况下均进行关联操作。 none:所有情况下均不进行关联操作。这是默认值。 save-update:在执行save/update/saveOrUpdate时进行关联操作。 delete:在执行delete时进行关联操作。 演示:在插入主表时,子表是否会发生改变! cascade=all发生改变,none不发生改变. 插入主表,对象包含子表,none的化,子表没有记录存在; 存储时主,从两方都需要在对象中包含对方,否则,插入总是有问题的!(演示)8.cascade和inverse有什么区别?可以这样理解,cascade定义的是关系两端对象到对象的级联关系;而inverse定义的是关系和对象的级联关系。 inverse,cascade的比较 inverse,cascade这两个属性本身互不影响,但起的作用有些类似,都能引发对关系表的更新。 inverse只对set+one-to-many(或many-to-many)有效,对many-to-one,one-to-one无效。 cascade对关系标记都有效。 两个起作用的时机不同: cascade:在对主控方操作时,级联发生。 inverse:在flush时(commit会自动执行flush),对session中的所有set,hibernate判断每个set是否有变化, 对有变化的set执行相应的sql,执行之前,会有个判断:if(inverse==true)return; 可以看出cascade在先,inverse在后。 对cascade,一般对many-to-one,many-to-many不设置级联删除。9.Hibernate可以通过设置hibernate.jdbc.fetch_size,hibernate.jdbc.batch_size等属性,对Hibernate进行优化。10. 默认都是false!在class字段设置! DynamicUpdate如果选定,则生成UpdateSQL时不包含未发生变动的字段属性,这样可以在一定程度上提升SQL执行效能.DynamicInsert如果选定,则生成InsertSQL时不包含未发生变动的字段属性,这样可以在一定程度上提升SQL执行效能集合的过滤: 1。children=session.createFilter(parent.getChildren(),"wherethis.age>5andthis.age<10").list() 针对一对多关联当中的集合元素非常庞大的情况,特别适合于庞大集合的分页: 2。session.createFilter(parent.getChildren(),"").setFirstResult(0).setMaxResults(10).list(); 倾向于细颗粒度的设计,面向对象,将大表拆分为多个关联关系的小表,消除冗余 (DBA比较忌讳关联关系的出现,但是ORM的缓存将突破关联关系 column,通过二级缓存提升性能 的性能瓶颈);Hibernate的性能瓶颈不在于关联关系,而在于大表的操作性能口诀1、使用双向一对多关联,不使用单向一对多2、灵活使用单向多对一关联3、不用一对一,用多对一取代4、配置对象缓存,不使用集合缓存5、一对多集合使用Bag,多对多集合使用Set6、继承类使用显式多态7、表字段要少,表关联不要怕多,有二级缓存撑腰1、到底在哪用cascade="..."?cascade属性并不是多对多关系一定要用的,有了它只是让我们在插入或删除对像时更方便一些,只要在cascade的源头上插入或是删除,所有cascade的关系就会被自己动的插入或是删除。便是为了能正确的cascade,unsaved-value是个很重要的属性。Hibernate通过这个属性来判断一个对象应该save还是update,如果这个对象的id是unsaved-value的话,那说明这个对象不是persistenceobject要save(insert);如果id是非unsaved-value的话,那说明这个对象是persistenceobject(数据库中已存在),只要update就行了。saveOrUpdate方法用的也是这个机制。2、到底在哪用inverse="ture"?inverse属性默认是false的,就是说关系的两端都来维护关系。这个意思就是说,如有一个Student,Teacher和TeacherStudent表,Student和Teacher是多对多对多关系,这个关系由TeacherStudent这个表来表现。那么什么时候插入或删除TeacherStudent表中的记录来维护关系呢?在用hibernate时,我们不会显示的对TeacherStudent表做操作。对TeacherStudent的操作是hibernate帮我们做的。hibernate就是看hbm文件中指定的是"谁"维护关系,那个在插入或删除"谁"时,就会处发对关系表的操作。前提是"谁"这个对象已经知道这个关系了,就是说关系另一头的对象已经set或是add到"谁"这个对象里来了。前面说过inverse默认是false,就是关系的两端都维护关系,对其中任一个操作都会处发对表系表的操作。当在关系的一头,如Student中的bag或set中用了inverse="true"时,那就代表关系是由另一关维护的(Teacher)。就是说当这插入Student时,不会操作TeacherStudent表,即使Student已经知道了关系。只有当Teacher插入或删除时才会处发对关系表的操作。所以,当关系的两头都用inverse="true"是不对的,就会导致任何操作都不处发对关系表的操作。当两端都是inverse="false"或是default值是,在代码对关系显示的维护也是不对的,会导致在关系表中插入两次关系。在一对多关系中inverse就更有意义了。在多对多中,在哪端inverse="true"效果差不多(在效率上)。但是在一对多中,如果要一方维护关系,就会使在插入或是删除"一"方时去update"多"方的每一个与这个"一"的对象有关系的对象。而如果让"多"方面维护关系时就不会有update操作,因为关系就是在多方的对象中的,直指插入或是删除多方对象就行了。当然这时也要遍历"多"方的每一个对象显示的操作修关系的变化体现到DB中。不管怎样说,还是让"多"方维护关系更直观一些。3、cascade和inverse有什么区别?可以这样理解,cascade定义的是关系两端对象到对象的级联关系;而inverse定义的是关系和对象的级联关系。4、net.sf.hibernate.ObjectDeletedException:deletedobjectwouldbere-savedbycascade(removedeletedobjectfromassociations):2,ofclass:Xxxxx这个问题出现在要删除关系的一头时。如,要删除一个已经和Student有关系的Teacher。当mit();时才会抛出这个异常。这时一个在关系另一头的Student对象中的Set或是List中把这个Teacher对象显示的remove掉,再session.delete(这个teacher);。这是为了防止在Student端有cascade时把这个Teacher对象再存回DB。所以,这个异常的只有在Student的关系定义中有cascade="...",而且没有像上面说的显示的解除关系时才会出现。所以防止出现这个异常的方法就是:1,在Student端不用cascade;2,或是用cascade的话,就显示的删除对像中的关系。3,在Teacher端要用cascade5、net.sf.hibernate.HibernateException:identifierofaninstanceofmy.MyObjectalteredfromNtoN这个异常其时不是多对多中常遇到的,但是这个异常的提示不makesense,所以提一下,是因为id的java对象中的type和hbm文件中定义的不一样,如:java中用long,而hbm中用type="integer",并且generator用的是identity时就会出现Hibernate查询:hql支持动态绑定查询参数[select/update/delete...][from...][where...][groupby...[having...]][orderby...]1.createQuery接口 直接拼接sql: fromUserasuwhereu.passWord>20 根据参数位置设置参数: fromUserasuwhereu.passWord>? 根据参数名称标识参数: Queryquery=session.createQuery("fromUserasuwhereu.passWord>:passWord"); query.setInteger("passWord",20); 用:指定参数名称 :=等于 <>:不等于 >: <: >=: <=: like: and: or: not: isnull: in(1,2,3): list:可以按照索引来随机访问,但不管是否用到了,都将数据转换为实体对象。 iterator:只能顺序访问,但是只把使用到的转换成了实体对象, 使用query实现数据库的更新: Queryquery=session.createQuery("updateUsersetpassWord=passWord+1"); query.executeUpdate(); 批量删除: Queryquery=session.createQuery("deleteUserwherepassWord>30"); query.executeUpdate(); 不用select: 用select(属性查询): Queryquery=session.createQuery("selectu.passWordfromUseru"); Listlist=query.list(); for(Objectobject:list){ System.out.println(object); } 动态构造实例方法: Queryquery=session.createQuery("selectnewUser(u.passWord)fromUseru"); Iteratorlist=query.iterate(); while(list.hasNext()){ Useru=(User)list.next(); System.out.println(u.getUserName()+""+u.getPassWord()); } 注意:使用属性的构造参数一定要存在,取出的是java对象,仅仅是结构,而不是 持久化对象! 使用sql的原生函数: selectupper()fromUseru selectdistinct(u.userName)fromUseru count() Queryquery=session.createQuery("selectcount(u),u.passWordfromUserugroupbypassWord"); Iteratorlist=query.iterate(); while(list.hasNext()){ Object[]o=(Object[])list.next(); System.out.println(o[0]+""+o[1]); } Queryquery=session.createQuery("selectcount(u),u.passWordfromUserugroupbypassWordhavingu.passWord>25"); Ite

温馨提示

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

评论

0/150

提交评论