- 浏览: 99808 次
- 性别:
- 来自: 广州
-
文章分类
最新评论
http://blog.csdn.net/hsuxu/article/details/8108326
Hibernate在初始化的时候,默认按照配置为表预定义insert,delete,update,select(by id)的SQL语句放在session中,其中insert,update,select操作都是对表的所有字段操作.如果在一个表有很多字段的时候,在做初次inser的时候有比较多的字段为空值,或者经常update某少部分字段,应该在配置文件的<class>元素上将dynamic-insert和dynamic-update设置为true.其默认值都为false.
如有这样一张表:create table hbtest(id int,val1 varchar2(100),val2 varchar2(100));
1,在 dynamic-insert没有设置的时候
<class name="com.test.hb.dynamicupdate.Hbtest" table="HBTEST">
Hbtest tbo = new Hbtest();
tbo.setId(new Integer(2));
tbo.setVal1("val1");
sessionFactory.getCurrentSession().save(tbo);
某些字段为空做insert,hibernate会用全字段的insert sql语句,如下:
insert into HBTEST(VAL1, VAL2,ID) values(?, ?,?)
2,将dynamic-insert设置为true,同样的保存,hibernate会动态生成SQL语句,没有值的字段不会出现在insert语句中.
<class name="com.test.hb.dynamicupdate.Hbtest" dynamic-insert="true" table="HBTEST">
insert into HBTEST(VAL1, ID) values(?, ?)
3,在 dynamic-update没有设置的时候
Hbtest tbo = (Hbtest) sessionFactory.getCurrentSession().load(Hbtest.class,new Integer(1));
tbo.setVal1("valXX");
tx.commit();
只更新部分字段,hibernate仍然对所有字段做更新:
update HBTEST set VAL1=?,VAL2=? where ID=?
4,同样的操作如果把设置为true的话,sql语句只包含更新的字段:update HBTEST set VAL1=? where ID=?
<class name="com.test.hb.dynamicupdate.Hbtest" dynamic-insert="true" dynamic-update="true" table="HBTEST">
5,Hibernate这种动态SQLupdate的特性是利用在对象从数据库加载到hibernate session的时候保存了一份快照,做更新的时候与这个快照做比较,只更新改动过的值.
所以下面这种情况就会用全部字段进行更新:,不设值的字段会被更新成null.
Hbtest tbo = new Hbtest();
tbo.setId(new Integer(1));
tbo.setVal1("val1ZZZ");
sessionFactory.getCurrentSession().update(tbo);
这种情况应该利用Hibernate提供的对SQL的支持,用SQL做更新操作.
动态update对性能有一个重大的影响,就是打开了以后,不同的对象的sql语句会不一样,如果你一次更新多条记录,hibernate将不能使用 executeBatch进行批量更新,这样效率降低很多。同时,在这种情况下,多条sql意味着数据库要做多次sql语句编译。
hibernate默认关闭了动态更新我认为是有道理的,通常情况下动态更新还是不要打开的好。
在你的情况下,是否应该打开,需要具体问题具体分析了。如果一个表字段比较多,并且经常只是更新一条记录的一两个字段,那么动态更新会更有效
select-before-update (可选,默认值为false): 指定Hibernate除非确定对象的确被修改了,不会执行SQL UPDATE操作。在特定场合(实际上,只会发生在一个临时对象关联到一个新的session中去,执行update()的时候),这说明Hibernate会在UPDATE之前执行一次额外的SQL SELECT操作,来决定是否应该进行UPDATE。
Hibernate在初始化的时候,默认按照配置为表预定义insert,delete,update,select(by id)的SQL语句放在session中,其中insert,update,select操作都是对表的所有字段操作.如果在一个表有很多字段的时候,在做初次inser的时候有比较多的字段为空值,或者经常update某少部分字段,应该在配置文件的<class>元素上将dynamic-insert和dynamic-update设置为true.其默认值都为false.
如有这样一张表:create table hbtest(id int,val1 varchar2(100),val2 varchar2(100));
1,在 dynamic-insert没有设置的时候
<class name="com.test.hb.dynamicupdate.Hbtest" table="HBTEST">
Hbtest tbo = new Hbtest();
tbo.setId(new Integer(2));
tbo.setVal1("val1");
sessionFactory.getCurrentSession().save(tbo);
某些字段为空做insert,hibernate会用全字段的insert sql语句,如下:
insert into HBTEST(VAL1, VAL2,ID) values(?, ?,?)
2,将dynamic-insert设置为true,同样的保存,hibernate会动态生成SQL语句,没有值的字段不会出现在insert语句中.
<class name="com.test.hb.dynamicupdate.Hbtest" dynamic-insert="true" table="HBTEST">
insert into HBTEST(VAL1, ID) values(?, ?)
3,在 dynamic-update没有设置的时候
Hbtest tbo = (Hbtest) sessionFactory.getCurrentSession().load(Hbtest.class,new Integer(1));
tbo.setVal1("valXX");
tx.commit();
只更新部分字段,hibernate仍然对所有字段做更新:
update HBTEST set VAL1=?,VAL2=? where ID=?
4,同样的操作如果把设置为true的话,sql语句只包含更新的字段:update HBTEST set VAL1=? where ID=?
<class name="com.test.hb.dynamicupdate.Hbtest" dynamic-insert="true" dynamic-update="true" table="HBTEST">
5,Hibernate这种动态SQLupdate的特性是利用在对象从数据库加载到hibernate session的时候保存了一份快照,做更新的时候与这个快照做比较,只更新改动过的值.
所以下面这种情况就会用全部字段进行更新:,不设值的字段会被更新成null.
Hbtest tbo = new Hbtest();
tbo.setId(new Integer(1));
tbo.setVal1("val1ZZZ");
sessionFactory.getCurrentSession().update(tbo);
这种情况应该利用Hibernate提供的对SQL的支持,用SQL做更新操作.
动态update对性能有一个重大的影响,就是打开了以后,不同的对象的sql语句会不一样,如果你一次更新多条记录,hibernate将不能使用 executeBatch进行批量更新,这样效率降低很多。同时,在这种情况下,多条sql意味着数据库要做多次sql语句编译。
hibernate默认关闭了动态更新我认为是有道理的,通常情况下动态更新还是不要打开的好。
在你的情况下,是否应该打开,需要具体问题具体分析了。如果一个表字段比较多,并且经常只是更新一条记录的一两个字段,那么动态更新会更有效
select-before-update (可选,默认值为false): 指定Hibernate除非确定对象的确被修改了,不会执行SQL UPDATE操作。在特定场合(实际上,只会发生在一个临时对象关联到一个新的session中去,执行update()的时候),这说明Hibernate会在UPDATE之前执行一次额外的SQL SELECT操作,来决定是否应该进行UPDATE。
发表评论
-
Java类修饰符总结
2014-10-27 04:00 921java的修饰符有:权限修饰符:public、protecte ... -
Java的参数传递(值传递与引用传递)作为形参传入方法,是否会改变原值?
2014-10-25 15:15 3988public class Hello { public s ... -
Java JDBC调用MySQL的存储过程简单示例
2013-09-30 04:07 762package com.toby.mysql; impo ... -
拆分web.xml
2013-02-25 17:16 1562转载 在web.xml文件中进行配置。导致 web.xml文件 ... -
Java对Cookie的操作
2012-12-04 17:26 800java对cookie的操作比较简 ... -
Java.net的ServerSocket与Socket
2012-12-01 16:48 3729ServerSocket类 ServerSocket ... -
ClassLoader的loadClass方法源码浅析
2012-11-20 15:46 1136protected synchronized Class& ... -
Call stack 与 Stack frame的概念
2012-11-17 16:36 6062Call stack(调用堆栈):调用堆栈是一个方 ... -
查找Proxy链中被代理的target对象 -《Javareflection in action》的例子
2012-11-15 16:37 0xxxxxx -
Class.class.isInstance(Object.class)
2012-11-05 10:43 928Class.class.isInstance(Object ... -
Class.class.isInstance(Class.class)
2012-11-03 17:15 899Class.class.isInstance(Class. ... -
Java关键字native,strictfp,transient,volatile
2012-11-02 15:53 0待续编辑它 -
关于创建JavaBean的小细节
2012-10-15 10:56 869例如创建一个User class 普通模式: sett ... -
Java运算符优先级整理
2012-09-22 16:49 834Java 中共有 54 种运算符,按优先级可以分为 14 级, ... -
DriverManager与DataSource的区别以及JDBC测试代码
2012-09-07 11:56 5588DriverManager与DataSource ... -
float与double的位分配
2012-08-25 17:30 2065摘自网络:http://zhidao.baidu.com/qu ... -
JAVA移位
2012-08-22 10:07 0移位运算符就是在二进 ... -
Java常量和类变量
2012-07-26 12:03 0常量的优点 如果在程序中直接填写数字,程序的可读性将会变差,程 ...
相关推荐
在Java的Hibernate ORM框架中,`dynamic-insert`和`dynamic-update`是两个非常重要的属性,它们主要用于优化数据库的插入和更新操作。这两个属性主要应用于实体类的映射文件(.hbm.xml)中,用于控制Hibernate如何...
"hibernatetools-Update-4.1.1.Final_2013-12-08_01-06-33-B605.zip" 是一个针对Eclipse的Hibernate工具集更新包,包含了对4.1.1.Final版本的增强和优化,为开发者提供了更加便捷的Hibernate操作界面和功能。...
Hibernate Tools是开发者在使用Hibernate框架进行Java应用程序开发时的重要辅助工具,它为Eclipse IDE提供了强大的集成支持,包括对象关系映射(ORM)的可视化设计、逆向工程、数据库生成、HQL和SQL查询编辑等功能。...
hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-4.1.12.Final.jar hibernate-jpa-2.0-api-1.0.1.Final.jar ...
而`hibernate-configuration-3.0.dtd`和`hibernate-mapping-3.0.dtd`是Hibernate 3.0版本中的两个核心文件,它们定义了Hibernate配置文件和映射文件的语法规则,是理解Hibernate工作原理的关键所在。 首先,我们来...
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
赠送jar包:hibernate-jpa-2.1-api-1.0.2.Final.jar; 赠送原API文档:hibernate-jpa-2.1-api-1.0.2.Final-javadoc.jar; 赠送源代码:hibernate-jpa-2.1-api-1.0.2.Final-sources.jar; 赠送Maven依赖信息文件:...
hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码 hibernate-jpa-2.1-api-1.0.0.final-sources.jar 源码
在部署和调试方面,Hibernate Tools提供了对JBoss服务器的紧密集成,包括部署、热更新和日志查看等功能。这使得开发者能够在本地环境中快速测试和调试应用,确保在生产环境中的稳定运行。 总之,Hibernate Tools ...
很多人为了配置jpa找这个动态产生字节码的jar文件,hibernate-distribution-3.3.1.GA包太大,而hibernate-distribution-3.3.2.GA的jar没有这个jar文件,希望对大家有用
在本文中,我们将深入探讨`hibernate-commons-annotations-5.0.1.Final.jar`的源码,了解其内部结构和主要功能。 一、元数据注解 HCA的核心在于提供了一系列的注解,如`@Entity`、`@Table`、`@Column`、`@Id`等,...
本文将深入探讨如何在Hibernate中处理Many-to-Many关系的级联保存、级联更新和级联删除。 一、Many-to-Many关系基础 在数据库设计中,Many-to-Many关系意味着两个实体之间存在多对多的关系。例如,学生可以选修多门...
Hibernate稳定版(hibernate-release-5.3.23.Final.zip),Hibernate ORM 是一个为应用程序、库和框架提供对象/关系映射 (ORM) 支持的库。它还提供了 JPA 规范的实现,这是 ORM 的标准 Java 规范。
《HibernateTools 3.2.4 Beta1:高效数据库管理和对象关系映射工具》 HibernateTools是Java开发者的重要辅助工具,它为Hibernate框架提供了一系列实用的集成开发环境(IDE)插件和命令行工具,极大地简化了数据操作...
hibernate-release-5.0.7.Final压缩包 -document -lib -project 内部Hibernate依赖库: antlr-2.7.7.jar dom4j-1.6.1.jar geronimo-jta_1.1_spec-1.1.1.jar hibernate-commons-annotations-5.0.1.Final.jar ...
hibernate-jpa-2.0-api-1.0.1.Final-sources.jar hibernate jpa 源代码
hibernate-jpa-2.0-api-1.0.1.Final.jar
hibernate-core-5.4.24.Final.jar
使用hibernate-validator 进行校验的jar包,里面包括了基础hibernate-validator-5.0.0.CR2.jar hibernate-validator-annotation-processor-5.0.0.CR2.jar 之外,还包括了el-api-2.2.jar javax.el-2.2.4等项目必不可...
hibernate-commons-annotations-5.1.0.Final.jar