`
Wind_ZhongGang
  • 浏览: 264733 次
  • 性别: 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)都设置为空了!

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

相关推荐

    tk-mybatis-dynamic-tablename:tk.mybatis动态创建表操作

    1. **动态表名绑定**:允许开发者在Mapper接口方法上通过注解@Select、@Insert、@Update和@Delete来指定动态表名。表名可以通过方法参数、实体类属性或者自定义表达式来动态计算。 2. **自动填充表名**:通过@Table...

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

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

    Hibernate笔记.doc

    `dynamic-insert="true"`表示在保存对象时,只有非空字段才会被包含在`insert`语句中,而`dynamic-update="true"`则意味着只有字段值发生变化时,才会包含在`update`语句中。它们的默认值都是`false`。 5. `<class>...

    hibernate实体映射文件字段设置默认值

    <class name="com.bulletin.bean.Bulletin" table="BULLETIN" schema="XJL" dynamic-insert="true" dynamic-update="true"> <!-- 映射类的属性 --> </hibernate-mapping> ``` 这里的`<class>`标签表示映射到...

    Dynamic-DML-Operations-using-sqlite3-and-python3

    动态DML操作(Data Manipulation Language)指的是根据程序运行时的条件灵活地执行INSERT、UPDATE、DELETE等SQL语句。 首先,我们需要导入sqlite3模块,然后连接到数据库。在Python中,这可以通过以下代码实现: `...

    hibernate说明文档

    - `dynamic-update`: 如果为`true`,则表示动态生成更新语句,只包含非空字段,避免不必要的更新操作。 4. **`<class>`** 元素用于定义类的映射。 - `mutable`: 如果为`false`,则相当于所有字段的`update`属性为...

    CVS适用,及在MYECLISPE中发布

    ### CVS适用及其在MyEclipse中的发布 ...根据描述中的部分代码片段,可以看出这里涉及到的配置主要是指`dynamic-insert`和`dynamic-update`属性,它们用于控制Hibernate是否动态地插入或更新记录。例如: ```xml ...

    hibernate关联映射的作用和常用属性解释

    - **`dynamic-update`**:设置为`true`时,只更新确实被修改过的字段,默认为`false`。 - **`dynamic-insert`**:设置为`true`时,只插入非空字段,默认为`false`。 - **`insert-before-update`**:设置为`true`时,...

    hibernate配置详细

    - **`dynamic-insert`** 和 **`dynamic-update`**: 这两个属性用于控制Hibernate是否动态地创建SQL插入和更新语句。默认情况下,这两个属性都是`false`。 - **`dynamic-update`**: 如果设置为`true`,则只更新那些...

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

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

    Dynamic Dao-开源

    它支持各种SQL操作,包括SELECT、INSERT、UPDATE、DELETE,以及存储过程的调用。同时,它还提供了事务管理、参数绑定、结果集映射等功能,使得开发者可以更专注于业务逻辑,而不是底层的数据库操作。 开源软件是...

    Row-Level Security & Dynamic Data Masking

    - **只在 SELECT 查询中生效**:DDM 只会在 SELECT 查询中对数据进行屏蔽,而不会在 INSERT、UPDATE 或 DELETE 操作中发挥作用。 - **不适用于所有数据类型**:某些数据类型可能无法使用 DDM。 - **对性能的影响**:...

    hibernate-mapping参数详解

    - **dynamic-insert**: 是否动态插入 SQL 语句,仅插入非空字段。 - **select-before-update**: 更新前是否先查询实体。 - **polymorphism**: 多态映射类型。 - **where**: 在查询时添加额外的 WHERE 子句。 - **...

    工作周报10221

    - **Hibernate逆向工程**:解决`ids for this class must be manually assigned`错误,修改了自动生成的ID配置,添加了`dynamic-update`和`dynamic-insert`属性以优化数据库操作。 - **Spring与Hibernate集成**:...

    第5章.数据查询及操作_-_微软_ERP_Dynamic_AX_企业开发(2009版)

    - 包括但不限于`insert`、`doinsert`、`delete`、`dodelete`、`delete_From`、`update`、`doupdate`、`selectforupdate`、`update_from`等关键字。 3. **数据控制语言(DCL-Data Control Language)** - 通过`...

    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 ...

    精通Hibernate第四章

    若要更新部分字段,可以使用`dynamic-insert`和`dynamic-update`属性,使Hibernate仅包含实际变化的字段生成SQL语句,提高效率。 处理SQL引用标识符是另一个重要的话题。在SQL中,特殊字符或包含空格的字段名需要...

    SQL语法大全

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

    php6 mysql5 for dynamic websites

    1. 数据库基础:数据库的设计、创建和管理,以及SQL语言的基本语法,如SELECT、INSERT、UPDATE和DELETE。 2. 数据类型和约束:了解各种数据类型(如INT、VARCHAR、DATE等)及其适用场景,以及如何设置字段的约束条件...

Global site tag (gtag.js) - Google Analytics