`
yan_sa
  • 浏览: 5704 次
  • 性别: 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语句。但是如果所有对象属性都没有变化时,那么不会发送更新语句。

 

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

 

http://dreamzhong.iteye.com/blog/1207377

分享到:
评论

相关推荐

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

    在Java的Hibernate ORM框架中,`dynamic-insert`和`dynamic-update`是两个非常重要的属性,它们主要用于优化数据库的插入和更新操作。这两个属性主要应用于实体类的映射文件(.hbm.xml)中,用于控制Hibernate如何...

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

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

    Hibernate笔记.doc

    5. `<class>`元素的`dynamic-insert`和`dynamic-update`属性:与`<property>`元素类似,但它们会影响到所有属性,如果设置为`true`,则在插入和更新时,只会包含非空或变化的字段。 在处理一对多的关联关系时,`...

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

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

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

    - **动态插入和更新**:`dynamic-insert`和`dynamic-update`属性允许Hibernate只插入或更新那些确实发生更改的字段。这对于避免不必要的数据库操作非常有用。 - **默认值类型**:默认值表达式的类型应与列的数据类型...

    hibernate说明文档

    - `mutable`: 如果为`false`,则相当于所有字段的`update`属性为`false`,即在更新操作时所有字段都被视为不可变,默认为`true`。 - `dynamic-insert`: 如果为`true`,则等价于所有字段动态生成插入语句,只包含...

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

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

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

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

    hibernate配置详细

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

    CVS适用,及在MYECLISPE中发布

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

    hibernate-mapping参数详解

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

    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,以及存储过程的调用。同时,它还提供了事务管理、参数绑定、结果集映射等功能,使得开发者可以更专注于业务逻辑,而不是底层的数据库操作。 开源软件是...

    精通Hibernate第四章

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

    Row-Level Security & Dynamic Data Masking

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

    工作周报10221

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

    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`:如果设为`true`,Hibernate仅在字段不为null时插入。 - `dynamic-update`:如果设为`true`,Hibernate仅在字段不为null时更新。 - `<id>`:定义主键映射。 - `name`:指定主键字段名称。 -...

    hbm.xml说明

    3. **dynamic-update**:布尔值,表示是否仅更新非空字段,默认为`false`。 4. **dynamic-insert**:布尔值,表示插入时是否忽略null值,默认为`false`。 5. **proxy**:设置懒加载时使用的代理类。 6. **...

    SQL语法大全

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

Global site tag (gtag.js) - Google Analytics