今天遇到一个问题;
在一个非事务方法A中,调用Bservice获取B对象;
对B对象的一个字段进行赋值,B.setB1("B1");
调用Bservice的update方法,update方法直接用hibernate的updateObject方法进行保存。
debug模式下,show-sql=true
结果发现:所有的字段都更新了,update B set B1=?,B2=?,B3=? where ....
这不符合我的需求,hibernate配置文件也已经设置了dynamic-update="true";
用了各种方法都不行;
后来发现一个帖子:http://bbs.csdn.net/topics/310254447
关键内容如下:
今天做了一个测试,发现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,则会更新所有可更新的属性。
尝试用第二种方法,merge再flush,解决问题!
本文介绍了在使用Hibernate框架时遇到的动态更新问题及其解决方案。通过分析两种有效的应用场景,特别是利用merge方法来实现按需更新的需求。

1万+

被折叠的 条评论
为什么被折叠?



