hibernate dynamic-update="true&q…
2019-05-18 07:07:55来源:博客园 阅读 ()
原文地址: https://yan-sa.iteye.com/blog/1913684
由于我在action层使用了注解多例@Scope("prototype"),而在dao层默认为单例......
我把sessionFactory写在了一个通用的basedao实现类中,
而在dao实现类中直接继承了basedao实现类,同时继承了sessionFactory...
本人能力有限,尚不知道与以上的设计有无紧要关系......
在网上搜索到的文章部分内容如下:
对于dynamic-update是重点需要讲解的地方,这里的情况比较复杂。
首先先来明确这一属性的含义,如果该属性设置为true,表明Hibernate在向数据库发送更新语句时只会包括属性值发生改变的属性,其实要说明的就是当将该属性设置为true,并不表明你的设置就起作用了,这取决于你使用的更新方法和查找与更新操作是否处在同一个session当中。
对于更新操作而言,分三步走,第一步是查找出需要更新的实体,第二步是更新需要更新的属性,第三步是保存更新实体。
如果这三步操作没有在同一个session的管理之下,那么即便设置了dynamic-update=true,这个属性也是不会起任何作用的,当你在保存更新时,Hibernate向数据库发送的更新语句还是会包括该实体的所有属性。
所以当你设置了dynamic-update=true时,你需要确保你的三步操作是在同一个session中的。
当然为了确保当进行更新操作时只更新那些修改了的属性,还有其它一些做法,但需要发送的sql语句也就不止一条更新语句那么简单而已,这需要你经过权衡后进行适当的选择。
下面就来讲解还有其它哪些做法能保证在进行更新操作时只更新那些修改了的属性。
第一种做法就是在配置文件中的class元素上再加上另一个属性值,select-before-update="true",这个属性表示当我们在进行更新操作时,会先去数据库中查找这个实体对象的数据,这样就保存了当我们在进行更新操作时,查找后更新始终都在同一个session当中。
第二种是更改更新操作的方法,使用session为我们提供的merge方法,当我们实用该方法时,是不需要配置dynamic-update=true属性的。该方法在更新对象时所做的操作和前一种方法是一样的,会先从数据库中查找该实体对象数据再向数据库发送只更新更改过的属性的更新操作,同样的会发送两条sql语句。但是如果所有对象属性都没有变化时,那么不会发送更新语句。
原文链接:https://www.cnblogs.com/Meiwah/p/10882104.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Java框架之Hibernate实战篇 2020-06-09
- Invalid [xxx] in servlet mapping 、 <url-pattern& 2020-06-07
- 错误: 在类中找不到 main 方法, 请将 main 方法定义为: & 2020-06-06
- Spring boot Sample 003之spring-boot-configuration-proper 2020-06-01
- 前端 技术之 Git&GitHub 2020-05-29
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash