今天做了一个测试,发现Hibernate的dynamic-update只在两种条件下生效:
1。load进来的对象和被执行update的对象在同一个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语句。
2。load进来的对象和被执行update的对象不在同一个session内,即要update的对象在另一个session中。代码示例:
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,则会更新所有可更新的属性。
----------------------------------------------------------------------------------------------
hibernate中session.load()作用
如果是第一次load一个对象,显然是要进行数据库查询的。如果是第二次,且原结果仍然保存在内存中,数据库也没有发生改变,则你应该相信hibernate是会从内存加载的。否则,只要有一个必须的条件不成立,就应该从数据库读取正确数据,而不是从内存中。
----------------------------------------------------------------------------------------------
hibernate操作数据库 插入修改数据库默认值 dynamic-insert dynamic-update2007-12-17 16:19Hibernate允许我们在映射文件里控制insert和update语句的内容.比如在映射文件中<property 元素中的update属性设置成为false,那么这个字段,将不被包括在基本的update语句中,修改的时候,将不包括这个字段了.insert同理.dynamic动态SQL语句的配置也是很常用的.下面介绍配置SQL语句的具体属性:
1)<property>元素 insert属性:设置为false,在insert语句中不包含这个字段,表示永远不会被插入,默认true
2)<property>元素 update属性:设置为false,在update语句中不包含这个字段,表示永远不会被修改,默认true
3)<class>元素 mutable属性:设置为false就是把所有的<property>元素的update属性设置为了false,说明这个对象不会被更新,默认true
4)<property>元素 dynamic-insert属性:设置为true,表示insert对象的时候,生成动态的insert语句,如果这个字段的值是null就不会加入到insert语句当中.默认false
5)<property>元素 dynamic-update属性,设置为true,表示update对象的时候,生成动态的update语句,如果这个字段的值是null就不会被加入到update语句中,默认false
6)<class>元素 dynamic-insert属性:设置为true,表示把所有的<property>元素的dynamic-insert属性设置为true,默认false
7)<class>元素 dynamic-update属性:设置为true,表示把所有的<property>元素的dynamic-update属性设置为true,默认false
Hibernate生成动态SQL语句的消耗的系统资源(比如CPU,内存等)是很小的,所以不会影响到系统的性能,如果表中包含N多字段,建议把dynamic-update属性和insert属性设置为true,这样在插入和修改数据的时候,语句中只包括要插入或者修改的字段.可以节省SQL语句的执行时间,提高程序的运行效率.
第一个方法解决了
在映射文件中,配置好后
然后在ACTION方法中,在同一个Session中,先Load该对象,再进行更新该操作