zoukankan      html  css  js  c++  java
  • hibernate dynamic-update="true"属性不起作用原因(转载)

    原文地址: https://yan-sa.iteye.com/blog/1913684

    由于我在action层使用了注解多例@Scope("prototype"),而在dao层默认为单例......

    我把sessionFactory写在了一个通用的basedao实现类中,

    而在dao实现类中直接继承了basedao实现类,同时继承了sessionFactory...

    本人能力有限,尚不知道与以上的设计有无紧要关系......用了网上的解决办法(添加属性dynamic-update和select-before-update都没效果)

    最后还是决定这样:

    和以下步骤是一样的......

    在网上搜索到的文章部分内容如下:

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

    Higher, faster, stronger!
  • 相关阅读:
    Centos7静态ip设置(亲测有效)
    14个Xcode中常用的快捷键操作(转)
    C,C++经典笔试题(答案)转自:http://blog.163.com/jianhuali0118@126/blog/static/377499702008230104125229/
    Cocos2d-x 3.2 项目源代码从Mac打包到安卓教程【转自:http://www.2cto.com/kf/201410/342649.html】
    NumPy的详细教程
    我对自己提的几个关于cocos2dx的几个问题
    为什么将类的构造函数设为私有的成员函数?
    cocos2d事件处理机制之我见
    windows7 + cocos2d-x 3.2 +vs2012 速度真的很慢
    CCActionManager
  • 原文地址:https://www.cnblogs.com/Meiwah/p/10882104.html
Copyright © 2011-2022 走看看