- 浏览: 264733 次
- 性别:
- 来自: 成都
文章分类
- 全部博客 (87)
- Java (6)
- Frameworks (1)
- JavaWeb (3)
- Spring (6)
- Hibernate (26)
- Maven (2)
- Plugin (1)
- Velocity (1)
- Freemarker (1)
- Spring security (18)
- Google (5)
- Guice (5)
- rmi (1)
- Annotation (1)
- Binding (1)
- commons-fileupload (3)
- fileupload (3)
- ehcache (1)
- ApplicationContext (1)
- Resource (1)
- Validator (1)
- PropertyEditor (1)
- one-to-many (5)
- cascade (2)
- MessageSource (1)
- Serialize (1)
- Serializable (1)
- delete (1)
- delete-orphan (1)
- fetch (1)
- one-to-one (1)
- join (4)
- DomainObject (1)
- CRUD (1)
- composite-element (1)
- Hibernate ORM (14)
- dynamic-insert (1)
- dynamic-update (1)
- Search (1)
- DDD (0)
- Job (0)
- element (1)
- Unique (1)
- Group (1)
- tomcat (1)
- https (1)
- mysql (1)
最新评论
-
xurunchengof:
[url][url][url][img][img][img][ ...
Spring Security 3多用户登录实现之三 验证过滤器 -
Wind_ZhongGang:
yo8237233 写道你这样的话如果上传文件超过了50000 ...
Spring集成Commons fileupload,文件上传 -
yo8237233:
你这样的话如果上传文件超过了50000000就会报异常
Spring集成Commons fileupload,文件上传 -
zhuzhiguosnail:
Wind_ZhongGang 写道lianglaiyang 写 ...
Spring Security 3多用户登录实现一 -
曾老师:
?????
Spring Security 3用户登录实现之十 用户切换
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语句。但是如果所有对象属性都没有变化时,那么不会发送更新语句。
以上见解都经实践检验,如有不同看法请批评指正。特附上源码,以供参考。
- HibernateORM.zip (32.7 KB)
- 下载次数: 441
评论
哎,只能写到隐藏域了。。。悲催。。
这和Hibernate本身是没有关系的,你要是修改表单信息,肯定没有必要每次在修改时就重新生成一个新的对象三,比如一个User类有id,username,password三个信息,如果我要修改这个User,肯定需要把修改的User的id传过来,先通过id找到user,再根据表单上的修改信息进行相应的更新
哎,只能写到隐藏域了。。。悲催。。
比如,一个学生表中有(id,name,pwd,sex,,phone,email);
我在修改页面的表单中只有pwd和email两个输入框。现在要是pwd和email的值不改变就提交的话,他却更新了 剩下的字段(name,sex,phone)都设置为空了!
这样的话,还是没有达到想要的效果呀...
不可能每次都把不需要改变的属性页一起写到页面表单的隐藏域吧
我也一直深受次配置的干扰。
比如,一个学生表中有(id,name,pwd,sex,,phone,email);
我在修改页面的表单中只有pwd和email两个输入框。现在要是pwd和email的值不改变就提交的话,他却更新了 剩下的字段(name,sex,phone)都设置为空了!
这样的话,还是没有达到想要的效果呀...
不可能每次都把不需要改变的属性页一起写到页面表单的隐藏域吧
发表评论
-
Hibernate unique使用
2011-11-28 22:16 1176在Hibernate中对于一对一的关联关系配置 ... -
Hibernate cascade在不同关联关系中的具体表现
2011-11-22 21:47 3141在Hibernate中,针对持久化实体的配置文件中有 ... -
Hibernate element使用
2011-11-20 20:43 1589一.Person package co ... -
Hibernate 单表实现树结构
2011-11-13 21:10 2842来看看通过单表来实现一个树形结构的方式。这里假设有这样 ... -
Hibernate save persist merge探究
2011-10-27 17:59 4139先来看看hibernate-reference.pd ... -
Hibernate Search配置及简单应用
2011-10-25 16:06 2583Hibernate Search是一款集成Apach ... -
Hibernate的三种配置方式
2011-10-24 16:58 1811对于Hibernate的配置方式,有三种,一种是通过 ... -
Hibernate one-to-many composite-element实现
2011-10-17 16:55 2652Hibernate中持久化实体间一对多关联关系的compo ... -
基于DomainObject的通用数据库CRUD操作
2011-10-17 15:09 1614对于项目中的持久化实体,持久化实体虽然对应着不同的业务对象 ... -
Hibernate one-to-many 双方双向连接表关联
2011-10-17 14:24 1740Hibernate中持久化实体间一对多关联,具体关联关 ... -
Hibernate one-to-many 多方单向连接表关联
2011-10-15 23:37 1297Hibernate中持久化实体间一对多 ... -
Hibernate one-to-many 一方单向连接表关联
2011-10-15 23:17 1706Hibernate中对于持久化实体间的关联关系有 ... -
Hibernate one-to-one 两方双向连接表关联
2011-10-15 17:38 2754Hibernate中对于持久化实体间的关联关系有三种分类, ... -
Hibernate fetch 抓取策略
2011-09-27 18:20 1368Hibernate fetch抓取策略定义了当抓 ... -
Hibernate 关联关系解除
2011-09-27 13:46 1548Hibernate对于持久化实体间的关联关系解 ... -
Hibernate one-to-many cascade探究
2011-09-08 13:20 1159对于Hibernate的one-to-many关联关系中, ... -
Hibernate inverse 深度解析
2011-08-09 22:55 1275inverse 英文意思为反向,倒转的。 Hi ... -
Hibernate ORM one-to-one主键关联关系映射
2011-08-01 22:08 1397Hibernate ORM one-to-one映射主要有 ... -
Hibernate ORM Inheritance
2011-07-31 22:56 1372Hibernate ORM提供了三 ... -
Hibernate many-to-many
2011-07-30 17:20 1897对于持久化实体间多对多的关联关系,在数据库中的反映 ...
相关推荐
1. **动态表名绑定**:允许开发者在Mapper接口方法上通过注解@Select、@Insert、@Update和@Delete来指定动态表名。表名可以通过方法参数、实体类属性或者自定义表达式来动态计算。 2. **自动填充表名**:通过@Table...
Dynamic-add-date是基于Mybatis插件原理开发的可以动态在Insert和Update Sql语句中添加日期列和对应的值的插件。 可以解决MySQL 5.6.5之前的版本对自动初始化时间戳的限制: DATETIME列不支持DEFAULT CURRENT_...
`dynamic-insert="true"`表示在保存对象时,只有非空字段才会被包含在`insert`语句中,而`dynamic-update="true"`则意味着只有字段值发生变化时,才会包含在`update`语句中。它们的默认值都是`false`。 5. `<class>...
<class name="com.bulletin.bean.Bulletin" table="BULLETIN" schema="XJL" dynamic-insert="true" dynamic-update="true"> <!-- 映射类的属性 --> </hibernate-mapping> ``` 这里的`<class>`标签表示映射到...
动态DML操作(Data Manipulation Language)指的是根据程序运行时的条件灵活地执行INSERT、UPDATE、DELETE等SQL语句。 首先,我们需要导入sqlite3模块,然后连接到数据库。在Python中,这可以通过以下代码实现: `...
- `dynamic-update`: 如果为`true`,则表示动态生成更新语句,只包含非空字段,避免不必要的更新操作。 4. **`<class>`** 元素用于定义类的映射。 - `mutable`: 如果为`false`,则相当于所有字段的`update`属性为...
### CVS适用及其在MyEclipse中的发布 ...根据描述中的部分代码片段,可以看出这里涉及到的配置主要是指`dynamic-insert`和`dynamic-update`属性,它们用于控制Hibernate是否动态地插入或更新记录。例如: ```xml ...
- **`dynamic-update`**:设置为`true`时,只更新确实被修改过的字段,默认为`false`。 - **`dynamic-insert`**:设置为`true`时,只插入非空字段,默认为`false`。 - **`insert-before-update`**:设置为`true`时,...
- **`dynamic-insert`** 和 **`dynamic-update`**: 这两个属性用于控制Hibernate是否动态地创建SQL插入和更新语句。默认情况下,这两个属性都是`false`。 - **`dynamic-update`**: 如果设置为`true`,则只更新那些...
该库将生成完整的DELETE,INSERT,SELECT和UPDATE语句。 该库实现的DSL与本机SQL非常相似,但是它包含许多允许非常动态SQL语句的功能。 例如,典型的搜索可以用这样的查询进行编码(以下代码是Kotlin,但是Java代码...
它支持各种SQL操作,包括SELECT、INSERT、UPDATE、DELETE,以及存储过程的调用。同时,它还提供了事务管理、参数绑定、结果集映射等功能,使得开发者可以更专注于业务逻辑,而不是底层的数据库操作。 开源软件是...
- **只在 SELECT 查询中生效**:DDM 只会在 SELECT 查询中对数据进行屏蔽,而不会在 INSERT、UPDATE 或 DELETE 操作中发挥作用。 - **不适用于所有数据类型**:某些数据类型可能无法使用 DDM。 - **对性能的影响**:...
- **dynamic-insert**: 是否动态插入 SQL 语句,仅插入非空字段。 - **select-before-update**: 更新前是否先查询实体。 - **polymorphism**: 多态映射类型。 - **where**: 在查询时添加额外的 WHERE 子句。 - **...
- **Hibernate逆向工程**:解决`ids for this class must be manually assigned`错误,修改了自动生成的ID配置,添加了`dynamic-update`和`dynamic-insert`属性以优化数据库操作。 - **Spring与Hibernate集成**:...
- 包括但不限于`insert`、`doinsert`、`delete`、`dodelete`、`delete_From`、`update`、`doupdate`、`selectforupdate`、`update_from`等关键字。 3. **数据控制语言(DCL-Data Control Language)** - 通过`...
- UniTreeView: Node dynamic add/delete support - UniTreeView: Several Memory leak issues - UniDBGrid: DBGrid.Column.Visible bug - PageControl: Render problem in invisible tabs - TUniListBox: Items ...
若要更新部分字段,可以使用`dynamic-insert`和`dynamic-update`属性,使Hibernate仅包含实际变化的字段生成SQL语句,提高效率。 处理SQL引用标识符是另一个重要的话题。在SQL中,特殊字符或包含空格的字段名需要...
adOpenDynamic 2 启动一个Dynamic类型的游标。 adOpenStatic 3 启动一个Static类型的游标。 ------------------------------------------------------------- 以上几个游标类型将直接影响到Recordset对象所有的属性...
1. 数据库基础:数据库的设计、创建和管理,以及SQL语言的基本语法,如SELECT、INSERT、UPDATE和DELETE。 2. 数据类型和约束:了解各种数据类型(如INT、VARCHAR、DATE等)及其适用场景,以及如何设置字段的约束条件...