`
Wind_ZhongGang
  • 浏览: 259695 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

dynamic-insert,dynamic-update 我有话要说

阅读更多

 

  在之前的一个项目中,Team leader说在每一个持久化实体的配置文件中的class元素上加上dynamic-insert="true" dynamic-update="true"可以一定程度上增加与数据库操作相关的速度,当时半信半疑就加上了,也没有自己去进行深入的了解。但最近在练习Hibernate时却发现,事实并非如此,抛开速度上的问题不管,单说加上这两个属性后,这两个属性起作用的时机就大有奥妙。

 

  对于dynamic-insert的理解是当需要进行插入或保存操作的持久化实体时,如果该实体中的某一个属性为NULL,那么在插入语句中就不包括该属性,比如一个Person有两个属性,一个是name,一个是description,那么当实例化一个Person时,如果description为NULL,那么Hibernate向数据库发送的sql语句就是insert into person(name) values(?)。配置文件中如果没有这一属性,默认为false。

 

  对于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语句。但是如果所有对象属性都没有变化时,那么不会发送更新语句。

 

  以上见解都经实践检验,如有不同看法请批评指正。特附上源码,以供参考。

1
0
分享到:
评论
5 楼 Wind_ZhongGang 2012-11-06  
w156445045 写道
依然没办法解决啊,
哎,只能写到隐藏域了。。。悲催。。

这和Hibernate本身是没有关系的,你要是修改表单信息,肯定没有必要每次在修改时就重新生成一个新的对象三,比如一个User类有id,username,password三个信息,如果我要修改这个User,肯定需要把修改的User的id传过来,先通过id找到user,再根据表单上的修改信息进行相应的更新
4 楼 w156445045 2012-11-06  
依然没办法解决啊,
哎,只能写到隐藏域了。。。悲催。。
3 楼 w156445045 2012-11-06  
iccboy 写道
我发现有个问题,就是经过上面的设置后,确实是只更新了“改变的”值
比如,一个学生表中有(id,name,pwd,sex,,phone,email);
我在修改页面的表单中只有pwd和email两个输入框。现在要是pwd和email的值不改变就提交的话,他却更新了 剩下的字段(name,sex,phone)都设置为空了!

这样的话,还是没有达到想要的效果呀...
不可能每次都把不需要改变的属性页一起写到页面表单的隐藏域吧


我也一直深受次配置的干扰。
2 楼 Wind_ZhongGang 2012-04-09  
嗯  你說的這個問題我在後面已經發現了,這裏的dynamic-update的用法比較複雜,並不是像我上面說的直接設置成true就可以的了 現在我們已經不再使用這個屬性了,而只是使用dynamic-insert,如果要說為什麼不用dynamic-update,這可以專門寫一篇文章來的
1 楼 iccboy 2012-04-02  
我发现有个问题,就是经过上面的设置后,确实是只更新了“改变的”值
比如,一个学生表中有(id,name,pwd,sex,,phone,email);
我在修改页面的表单中只有pwd和email两个输入框。现在要是pwd和email的值不改变就提交的话,他却更新了 剩下的字段(name,sex,phone)都设置为空了!

这样的话,还是没有达到想要的效果呀...
不可能每次都把不需要改变的属性页一起写到页面表单的隐藏域吧

相关推荐

    dynamic-add-date:一款基于MyBatis框架,可以对插入和更新Sql语句动态地添加日期列和对应值的插件

    Dynamic-add-date是基于Mybatis插件原理开发的可以动态在Insert和Update Sql语句中添加日期列和对应的值的插件。 可以解决MySQL 5.6.5之前的版本对自动初始化时间戳的限制: DATETIME列不支持DEFAULT CURRENT_...

    hibernate乐观锁和悲观锁学习

    <class name="org.hibernate.sample.TUser" table="t_user" dynamic-update="true" dynamic-insert="true" optimistic-lock="version"> …… </hibernate-mapping> optimistic-lock 属性有如下可选取值: none:无...

    mybatis-dynamic-sql:Kotlin和JavaSQL DSL(域特定语言)。 支持MyBatis或Spring JDBC模板的呈现

    该库将生成完整的DELETE,INSERT,SELECT和UPDATE语句。 该库实现的DSL与本机SQL非常相似,但是它包含许多允许非常动态SQL语句的功能。 例如,典型的搜索可以用这样的查询进行编码(以下代码是Kotlin,但是Java代码...

    unigui0.83.5.820

    - UniTreeView: Node dynamic add/delete support - UniTreeView: Several Memory leak issues - UniDBGrid: DBGrid.Column.Visible bug - PageControl: Render problem in invisible tabs - TUniListBox: Items ...

    SQL语法大全

    adOpenDynamic 2 启动一个Dynamic类型的游标。 adOpenStatic 3 启动一个Static类型的游标。 ------------------------------------------------------------- 以上几个游标类型将直接影响到Recordset对象所有的属性...

    ArcPy and ArcGIS - Second Edition

    Arc Py Cursors - Search, Insert, and Updateb'Chapter 3: Arc Py Cursors - Search, Insert, and Update'b'Pythonfunctions\xc3\x82\xc2\xa0\xc3\xa2\xc2\x80\xc2\x93\xc3\x82\xc2\xa0avoidrepeating code'b'The ...

    关于游标使用sql

    测试3条数据 ...[ STATIC | KEYSET | DYNAMIC | FAST_FORWARD ] [ READ_ONLY | SCROLL_LOCKS | OPTIMISTIC ] [ TYPE_WARNING ] FOR select_statement [ FOR UPDATE [ OF column_name [ ,...n ] ] ]

    Delphi7.1 Update

    * This update can not be removed after it is installed.* You will need the original Delphi 7 installation CD available to install this update.* To install this update from the CD, insert the CD, and ...

    T-SQL基本原理-第三版

    Insert, update, delete, and merge data Use transactions in a concurrent environment Get started with programmable objects–from variables and batches to user-defined functions, stored procedures, ...

    Delphi7.完美经典

    14-2-5 INSERT、UPDATE语句 14-2-6 DELETE语句 14-3 SQL指令高级使用 14-3-1 UNION运算 14-3-2 JOIN运算 14-3-3 特殊运算符 14-3-4 子查询(Sub Query) 第15章 Delphi数据库程序基础 15-1 Delphi各种数据库...

    微软内部资料-SQL性能优化3

    For example, a second transaction traversing the doubly linked list mentioned above would see the list before or after the insert, but it will see only complete changes. Durability After a ...

    Delphi7.完美经典.part1

    14-2-3 DROP语句 14-2-4 SELECT语句 14-2-5 INSERT、UPDATE语句 14-2-6 DELETE语句 14-3 SQL指令高级使用 14-3-1 UNION运算 14-3-2 JOIN运算 14-3-3 特殊运算符 14-3-4 子查询...

    这是一篇有关 在线聊天系统 的系统报告书

    more effective handling of customer requests, and has a simpler and more easy database access methods, easy to maintain and update. view of the above program, the system uses Html, JavaScript and ...

    sqlmap (懂的入)

    | Insert_priv | enum | | Lock_tables_priv | enum | | max_connections | int | | max_questions | int | | max_updates | int | | max_user_connections | int | | Password | char | | Process_priv | ...

    sciter-sdk-4.0.3.5348

    [textarea, edit] fix of dynamic @novalue handling NOTE: sciter.dlls, sciter.exe and notes.exe Windows executables in SDK are digitally signed now. On MacOS you may need to run SDK executables directly...

    FlexGraphics_V_1.79_D4-XE10.2_Downloadly.ir

    Version 1.7 ----------- - ADD: Delphi/CBuilder 10.2 Tokyo now supported. - ADD: Delphi/CBuilder 10.1 Berlin now supported. - ADD: Delphi/CBuilder 10 Seattle now supported. - ADD: Delphi/CBuilder XE8 ...

    十天学会ASP.net--我认为ASP.NET比ASP难很多,希望大家做好准备

    我要申明一点,操作系统就用2000,如果说要学习一个网络语言还不肯多装一个操作系统的话,那我看也不要学习了。 先到网上下载一个MDAC(要是2.7以上的版本才行),然后安装,安装以后或许会重新启动一次。 然后再...

    simple-tags

    * Dynamic Tag Clouds with colors with Widgets (random order, etc) And more... == Installation == **Required PHP5.** The Simple Tags can be installed in 3 easy steps: 1. Unzip "Simple tags" ...

Global site tag (gtag.js) - Google Analytics