对于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语句。但是如果所有对象属性都没有变化时,那么不会发送更新语句。(使用merge时 如果有配置多的一方:有配置Set<...> xx=new HashSet<...>()时,用merge会删除Set方,所以使用merge要注意显示sql是否有删除操作,非常容易误用)
2、Hibernate的dynamic-update.txt
今天做了一个测试,发现Hibernate的dynamic-update只在两种条件下生效:
1。同一session内,对已经persisit的对象进行update,这里的“已经persist”是指update之前先进行了create或者load调用。代码示例:
Session session = openSession();
User user =
(User)session.load(User.class,new
Long(12));
user.setAddress(null);
session.update(user);
session.flush();
将hibernate配置成show_sql=true,可以看到update产生的sql语句。
使用load如果从数据库中没有找到这条数据,则要抛出异常
2。不同session之间,update传入的对象是另一个session中的persist对象(对该对象调用了create或者load方法)。代码示例:
Session session1 = openSession();
User user =
(User)session1.load(User.class,new Long(12));
Session session2 =
openSession();
user.setAddress(null);
session2.merge(user);
session2.flush();
如果将session2.merge(..)改成update,则会更新所有可更新的属性。
merge:可以操作不同的域,不把merge的对象持久化,这与saveOrUpdate的最大不同
分享到:
相关推荐
在Java的Hibernate ORM框架中,`dynamic-insert`和`dynamic-update`是两个非常重要的属性,它们主要用于优化数据库的插入和更新操作。这两个属性主要应用于实体类的映射文件(.hbm.xml)中,用于控制Hibernate如何...
`hibernate`的`dynamic-update`属性提供了对此场景的一种解决方案。如果在`<class>`映射中设置了`dynamic-update="true"`,Hibernate会在生成的SQL更新语句中只包含实际被修改的字段,而不是所有字段。这可以显著...
如果设置为 true,则映射文件可以使用简化的类名,Hibernate 会在编译时自动处理 FQN 的导入。如果设置为 false,则必须显式地使用完整的类名。 ### 关于 cascade 属性 cascade 属性用于控制级联操作的行为,它...
- **动态插入和更新**:`dynamic-insert`和`dynamic-update`属性允许Hibernate只插入或更新那些确实发生更改的字段。这对于避免不必要的数据库操作非常有用。 - **默认值类型**:默认值表达式的类型应与列的数据类型...
例如,教程中提到的版本为 `jbosstools-3.2.1.Final.component--hibernatetools-Update-2011-08-01_12-53-33-H1305.zip`。 - **安装步骤**:下载后的压缩文件需解压并放入 Eclipse 的 `dropins` 目录下,并且需要...
在Java对象持久化技术中,Hibernate是一个广泛使用的框架,它简化了数据库操作,将对象与数据库表进行映射,使得开发人员能够以面向对象的方式处理数据。在《精通Hibernate:Java对象持久化技术详解》的第4章以及后续...
在本文中,我们将深入探讨Hibernate 4.2.1版本的主要特点、功能改进以及如何在Eclipse环境中集成和使用。 **1. Hibernate ORM框架概述** Hibernate是一个开源的Java库,它简化了Java应用程序与关系数据库之间的交互...
- **dynamic-update**和**dynamic-insert**: 控制是否动态生成SQL更新和插入语句,基于只有修改过的字段。 - **select-before-update**: 在更新前是否先执行SELECT语句,确保并发安全。 - **polymorphism**: 控制...
- **`table`**:对应数据库中的表名,默认情况下,Hibernate会使用类名的小写形式作为表名。 - **`discriminator-value`**:用于多态映射时区分不同子类的值。 - **`mutable`**:指定是否允许修改对象的状态,默认为...
<class name="com.isoftstone.javasource.course" table="courses" dynamic-insert="true" dynamic-update="true"> </hibernate-mapping> ``` 上述示例展示了如何使用XML映射文件定义一个课程实体,指定其...
: "field-description">指定描述类的属性javaDoc <!-- 更多的元数据属性配置 --> ### Hibernate配置详解 ...通过理解这些配置元素和属性,开发者可以更有效地使用Hibernate进行数据库操作,实现高效的数据持久化。
根据提供的文件信息,我们可以深入探讨Hibernate的详细配置与使用方法。 ### Hibernate简介 Hibernate是一个开源的对象关系映射(ORM)框架,它为Java应用程序提供了一种将对象模型映射到数据库的方法,允许开发者...
- **动态类型**:使用 `<dynamic-insert>` 和 `<dynamic-update>` 实现动态 SQL。 - **延迟加载**:通过 `<lazy>` 属性控制关联对象的加载时机。 ##### 4.5 Tuplizer - **目的**:解释 Tuplizer 的作用及其配置...
若要更新部分字段,可以使用`dynamic-insert`和`dynamic-update`属性,使Hibernate仅包含实际变化的字段生成SQL语句,提高效率。 处理SQL引用标识符是另一个重要的话题。在SQL中,特殊字符或包含空格的字段名需要...
dynamic-update="true" dynamic-insert="true" batch-size="3"> column="id" type="java.lang.Integer"> </hibernate-mapping> ``` #### 七、Hibernate配置文件(hibernate.cfg.xml)设置 `...
- **`dynamic-insert`** 和 **`dynamic-update`**: 这两个属性用于控制Hibernate是否动态地创建SQL插入和更新语句。默认情况下,这两个属性都是`false`。 - **`dynamic-update`**: 如果设置为`true`,则只更新那些...
1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 3.1. 可编程的配置方式 ...
- `dynamic-update`:如果设为`true`,Hibernate仅在字段不为null时更新。 - `<id>`:定义主键映射。 - `name`:指定主键字段名称。 - `<column>`:定义数据库表中的列信息。 - `name`:指定列名。 - `length`...
- 动态生成 SQL 更新语句,根据 `hbm.xml` 文件执行,不检查脏数据(除非开启 `dynamic-update`)。 - **更新(merge())**: - `merge()` 会先在缓存中查找对象,如果找到则使用该对象进行脏数据检查,未找到则...
通过使用Hibernate,开发人员可以将Java对象映射到数据库表中,并在不编写SQL的情况下执行CRUD操作。 #### 二、如何进行Hibernate编程? 进行Hibernate编程主要包括以下几个步骤: 1. **环境搭建**:下载并安装...