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执行的!

  • 相关阅读:
    leetcode 576. Out of Boundary Paths 、688. Knight Probability in Chessboard
    leetcode 129. Sum Root to Leaf Numbers
    leetcode 542. 01 Matrix 、663. Walls and Gates(lintcode) 、773. Sliding Puzzle 、803. Shortest Distance from All Buildings
    leetcode 402. Remove K Digits 、321. Create Maximum Number
    leetcode 139. Word Break 、140. Word Break II
    leetcode 329. Longest Increasing Path in a Matrix
    leetcode 334. Increasing Triplet Subsequence
    leetcode 403. Frog Jump
    android中webView加载H5,JS不能调用问题的解决
    通过nginx中转获取不到IP的问题解决
  • 原文地址:https://www.cnblogs.com/huaziWEB/p/4454902.html
Copyright © 2011-2022 走看看