zoukankan      html  css  js  c++  java
  • HIbernate 延迟加载和级联删除

    今天特别的记录一句话,或者说记录一下编程体会。昨天和一老师讨论hibernate数据库的问题,老师说这个问题我也不会。咱两可以讨论研究一下。讨论结束后,老师说今天我们又对hibernate有了新的认识又深入了一点。然后我突然想到,看书上课学到的知识几乎忘的一干二净。记住的都是自己遇到的bug,和解决bug的技术知识。看来发现问题和解决问题才是最好的老师,而记录问题和解决方法就是对这个过程的最好总结和知识积累。
    还是老套路,说一下遇到延迟加载和级联删除的背景。
    在一个正在做的项目开发中,DAO层获取到数据对象,而在Action层处理业务逻辑的时候object.getXXX。突然发现报错:no-Session。当时就蒙了,以为是HttpSession,一细看是hibernate的报错信息。百度一通后发现。有一个东西叫做hibernate延迟加载。打开hibernate映射配置文件,hbm.xml集合属性默认lazy=true。也就是说,hibernate默认延迟加载了set属性。而当我从DAO层返回数据对象后,关闭了session。set属性对象并没有被加载到内存中去,所以报错。
    为什么要出现延迟加载这个东西呢!一个持久化对象如果存在好几个set属性集合,一次查询又有几百万条记录,那么一次性直接加载到内存是十分悲剧的一件事情。而很多时间,我们很有可能只需要得到一个属性或者字段的值。那么此时将造成极大的浪费。而延迟加载就是对这种情况的优化方案。当然有时是没有必要的,lazy=false就ok了!
    当出现多对一的关系的时候往往出现外键约束,那么在删除一的方的时候往往因为外键约束而不能正常删除。那么就需要先删除多的一方解除此约束,然后再删除一的一方。显然手动的处理是相当麻烦的一件事情。所以一般情况下数据库都为我们提供了级联删除的功能。不同的数据库配置或者定义级联删除的操作不一定相同,不再赘述。因为这种配置或者定义不同所以存在一定的可移植性问题。所以最好能在hibernate层处理,那么在hibernate中是怎么处理的呢?很简单在many-to-one里设置 cascade=“delete”,当然cascade是有四个值的update save delete 和all。视情况选择恰当的值操作。
    需要注意的是,在使用hibernate级联删除的时候必须使用对象删除,使用HQL语句删除是达不到效果的。因为只有使用到持久化对象才会加载配置文件,从而读取到级联删除的配置。而HQL在删除操作的时候是不使用持久化对象,而是翻译成sql执行的!

  • 相关阅读:
    快捷键打开远程桌面
    织梦Dedecms后台登陆密码忘记怎么办?
    Windows curl开启注意事项
    Composer教程
    composer.json和composer.lock有什么区别?
    Web.config 文件例子
    win10回收站右键有2个“CCleaner”怎么删除
    sublime快捷键
    Json 文件注意事项
    加入购物车流程
  • 原文地址:https://www.cnblogs.com/huaziWEB/p/4454902.html
Copyright © 2011-2022 走看看