论坛首页 Java企业应用论坛

Hibernate3利用DML风格进行操作(hql)批量进行更新无法同步乐观锁的问题?

浏览 5944 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-01-19  
Hibernate3中可以提供DML风格的操作(hql)这样如果我们直接用DML风格写hql进行批量数据修改的直接操作势必会大大提高效率比起session.update(obj)这样针对PO的操作要快了很多,现在出现的问题是当我如果直接进行了HQL操作见代码:
Query query = session.createQuery("update Test set name = name||id where id>0");
query.executeUpdate();

则没有办法进行Test这个对象的version(在数据库中我加了version字段用于乐观锁机制)进行一个有效的更新,这样造成的结果就是在我进行批量更新的时候另外一个事务并发访问了这个数据依然是可以进行更改,到最后会出现脏数据库,这样就数据安全性来讲是肯定不行的,所以我查找Hibernate Reference中关于批量部分的内容给出的答案是进行versioned关键字的添加来强制进行version同步,内容如下:

引用

HQL UPDATE statements, by default do not effect the Section 5.1.7, “version (optional)” or the Section 5.1.8, “timestamp (optional)” property values for the affected entities; this is in keeping with the EJB3 specification. However, you can force Hibernate to properly reset the version or timestamp property values through the use of a versioned update. This is achieved by adding the VERSIONED keyword after the UPDATE keyword.

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
String hqlVersionedUpdate = "update versioned Customer set name = :newName where name = :oldName";
int updatedEntities = s.createQuery( hqlUpdate )
        .setString( "newName", newName )
        .setString( "oldName", oldName )
        .executeUpdate();
tx.commit();
session.close();

这样我在我的代码中加了versioned关键字:
Query query = session.createQuery("update versioned Test set name = name||id where id>0");
query.executeUpdate();

但系统会抛出异常为不合法的语句,不清楚问题出在哪里,请大家看看,而且这样进行批处理的一个操作当其中有数据库正在修改的时候version已经改变变了会不会在批处理进行提交时候抛出异常也就是说在批处理的时候乐观锁是否依然可以生效!
   发表时间:2007-01-19  
什么数据库? ||  测试通过吗? hibernate翻译出来的sql有没有问题呢?
0 请登录后投票
   发表时间:2007-01-21  
||是没问题的.标准SQL也是支持的测试也通过..语句没问题...主要是同步的问题.
0 请登录后投票
   发表时间:2007-01-21  
翻译出来的sql拿去执行都没有问题 怎么还会报语句错误。exception贴上来看看
0 请登录后投票
   发表时间:2007-01-22  
这个帖子正规多了,比较容易找问题了。

不过,Exception还是要帖出来啊,exception里的包含的信息往往能帮助debug。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics