hibernate更新一个字段(转http://hi.baidu.com/it_master/blog/item/7b55d0e6c2d93c3fb93820b0.html)

Coordinator
Nov 16, 2011 at 10:33 AM
2010-11-30 14:42
hbm.xml
Java代码
dynamic-update="true"  
dynamic-update="true"
DAOImpl
Java代码
this.getHibernateTemplate();.saveOrUpdate();;  

this.getHibernateTemplate();.saveOrUpdate();;

 

hbm中声明dynamic-update="true"后,应该在控制台上看到 动态生成的 sql(只包含赋过值的字段),而不是更新表的所有字段。

Hibernate的dynamic-update

 

在update记录的时候
从数据库里查询出一条数据 并在页面显示出来 修改之
但是问题就出在表单提交之后了 数据库中有很多字段 但是更新的只有几个字段
如果用hibernate的update会更新所有的字段 包括没有发生变化的字段 也就是说会把你不想改变的字段全部清空
这样的话更新数据可是相当的麻烦 有没有简便的方法呢 ? 有 hibernate提供了dynamic-update属性 你只要设置为true就可以在更新的时候只更新发生改变的字段 其余字段保持数据库中的原有值。
但是这个dynamic-update=‘true’只在如下情况下有效:
1 同一个session中
Session s = openSession();
tx = s.beginTx();
User user = s.load(User.class, id);
user.setName('xuly');
tx.commit();
s.close();
Ok 这样只会更新name一个字段 其他的字段不会被更新
如果在session1中load一个po 然后在session2中 update 对不起 这样不管用
那么我跨session的时候能不能使用dynamic-update呢? 可以
用merge()

 

 

 

 

老生常谈——Hibernate的dynamic-update只在两种条件下生效

1、同一session内,对已经persisit的对象进行update,这里的“已经persist”是指update之前先进行了create或者load调用。代码示例:

1.
2.
3.
4.
5.
6.

2、不同session之间,update传入的对象是另一个session中的persist对象(对该对象调用了create或者load方法)。代码示例:

1.
2.User user = (User)session1.load(User.Long(
3.
4.
5.
6.

 

 

 

 

转载于:http://www.jdon.com/jivejdon/thread/8571

 


把一个对象find出来之后,只修改了其中一两个字段,然后调用update把对象存储到数据库。看到hibernate产生的sql语句类似于这样:


update organization set orgname=?, type=?, createTime=?, modifiedTime=?, address=?, postalcode=?, email=?, telephone=?, homepage=?, orgDesc=?, managerId=? where id=?

 

就是说一个session.update()方法,会把整个记录全部更新一次。但实际上我只需要修改其中的一个字段而以。
有没有办法让hibernate只更新修改过的字段或指定更新个别字段?

这样作可以从一定程度上避免覆盖到别人修改的字段,同时提高效率。不知道用hibernate怎么作

--------

看这个link:
http://www.jdon.com/jive/thread.jsp?forum=62&thread=8457

引用------------------------------------------------------------
update语句是在Hibernate的Configuration的时候生成的,不能动态改变

为什么update的时候所有的属性都一起update,而不是只更新改变字段,其实这是一个比较值得探讨的问题。

如果想要做到只更新改变了的字段,必须做到两点:
1、对PO的每个属性设置version进行状态跟踪
2、update语句是动态生成的,在实际向数据库更新的时候,依次检查每个属性的version,决定哪些属性需要更新,动态构造update语句。

单单要做到上述第一点,就势必要给PO的操作带来沉重的负担,每次属性的存取都要判断version,严重影响PO的性能。会带来整个Hibernate性能的降低。而要做到第二点,临时构造update语句时间消耗很客观,也会极大降低update的速度。

Hibernate的PO状态管理是当任何属性值改变的时候,version就被标记,表明PO被更新了。实现很简单而有效,效率非常高。而update语句insert,delete和某几个select语句是在Hibernate初始化过程中就构造好了,不需要用的时候临时构造。

综合评价得与失,对PO属性进行状态管理固然可以稍微降低数据库负担,但是会极大影响Hibernate的运行效率,终究得不偿失。