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

hibernate dynamic-update="true"属性不起作用原因(转载)的更多相关文章

  1. 以Java属性文件的格式创建Hibernate的配置文件和DTD特殊符号作用

    演示样例代码 hibernate.dialect=org.hibernate.dialect.MySQLDialect hibernate.connection.driver_class=com.my ...

  2. 攻城狮在路上(壹) Hibernate(三)--- 属性访问、命名策略、派生属性、指定包名等

    一.hibernate访问持久化类属性的策略: 在<property>元素中的access属性用于指定Hibernate访问持久化类属性的方式. 常见的方式如下: 1.property:默 ...

  3. [Hibernate]dynamic-insert和dynamic-update属性

    这二个属性默认情况均为false,你可以通过以下二种方式进行配置使用: 1.Annotation @Entity @Table(name = "stock_transaction" ...

  4. Hibernate中inverse="true"的理解

    Hibernate中inverse="true"的理解 举例如下 转自:http://lijiejava.iteye.com/blog/776587 Customer类: publ ...

  5. Hibernate 中update hql语句

    今天在MySQL中用hibernate测试update语句发现以下问题: update语句竟然不去作用: 表机构如下: create table student(sid int primary key ...

  6. mysql timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性

    timestamp有两个属性,分别是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP两种,使用情况分别如下: 1.CURRENT_TIMESTAMP 当要向 ...

  7. hibernate的update() 更新延迟或者无法更新,导致同个service调用存储过程执行方法不精确

    hibernate的update()方法无法更新,不报错 原因是hibernate的update方法操作的是缓存,可以flush下先. 设置缓存为false理论上也可. 在一个serivce方法里,执 ...

  8. Linux串口c_cc[VTIME]和c_cc[VMIN]属性设置的作用

    Linux串口c_cc[VTIME]和c_cc[VMIN]属性设置的作用 在串口编程模式下,open未设置O_NONBLOCK或O_NDELAY的情况下. c_cc[VTIME]和c_cc[VMIN] ...

  9. hibernate 返回对象指定属性,需要返回的列,可以直接返回 对象属性

    // hibernate 返回对象指定属性,需要返回的列,可以直接返回 对象属性 @Override public TeamPlan getTeamPlanByBaoMingId(String bao ...

随机推荐

  1. 手机酷派4G5316 5313s 黑砖 求转成功 9008端口 9006端口 少走弯路选对镜像

    首先要有资料 里面有教程  http://pan.baidu.com/s/1bpjxP6n 1.用其他手机 or u 盘往sd卡放进“强制进入下载模式的文件” 2. 驱动 3.刷机工具 下载镜像   ...

  2. 无聊的我写了一个代码 。。。P1605 迷宫

    搜索水题 哎 直接不行了 . #include <ctype.h> #include <cstdio> void read(int &x) { x=;char ch=g ...

  3. 迅为7寸工业触摸屏嵌入式平台可用于ARM嵌入式一体机

    7寸触摸屏介绍产品名称:7寸IPS高清屏幕分辨率:1280*800触摸屏类型:电容屏(五点触摸)接线方式: FPC 可应用于嵌入式一体机.自动售货机.广告机.智能自动终端.零售终端等 ARM平台处理器 ...

  4. CE工具里自带的学习工具--第五关

    图解: 此时会弹出一个对话框,选择是就可以了,最终会看到:

  5. 在 VS2015+EF6.0中使用Mysql 遇到的坑

    1)首先是要在vs2015中安装mysql Database 默认是不存在的 1)下载mysql-connector-net-6.9.9.msi    地址:https://dev.mysql.com ...

  6. [GXOI/GZOI2019]宝牌一大堆(dp)

    luogu     bzoj 这个麻将题还算挺友善的,比隔壁zjoi的要好得多... 比较正常的做法是五维dp 但事实上六维dp也是完全不会被卡的 七对子选权值最高的七个,国士无双直接$13^2$暴力 ...

  7. Mysql对象

    2.简介 2.1 存储过程 2.1.1什么是存储过程 存储过程就是一种类似函数的脚本,可以把多个sql语句组合起来,然后使用 call 存储过程名 来调用,从而执行这些SQL语句. 特点:一次编译,下 ...

  8. PermGen space OOM 记录

    前些天线上除出了个OOM问题,今天闲下来记录下: OOM的提示信息是-PermGen space,说明问题出在方法区,方法区存的是什么东西?:类的加载信息.常量.静态变量. 按照方法区的定义:类加载的 ...

  9. buf.slice()

    buf.slice([start[, end]]) start {Number} 默认:0 end {Number} 默认:buffer.length 返回:{Buffer} 返回一个指向相同原始内存 ...

  10. MySQL-----连表

    连表: **拿到两张表的信息** select * from userinfo,department 弊端是数据会乱,出现重复,不建议这样. **使userinfo表的part_id列与departm ...