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

Hibernate3中可以提供DML风格的操作(hql)这样如果我们直接用DML风格写hql进行批量数据修改的直接操作势必会大大提高效率比起session.update(obj)这样针对PO的操作要快了很多,现在出现的问题是当我如果直接进行了HQL操作见代码:
[code]
Query query = session.createQuery("update Test set name = name||id where id>0");
query.executeUpdate();
[/code]
则没有办法进行Test这个对象的version(在数据库中我加了version字段用于乐观锁机制)进行一个有效的更新,这样造成的结果就是在我进行批量更新的时候另外一个事务并发访问了这个数据依然是可以进行更改,到最后会出现脏数据库,这样就数据安全性来讲是肯定不行的,所以我查找Hibernate Reference中关于批量部分的内容给出的答案是进行versioned关键字的添加来强制进行version同步,内容如下:

[quote]
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.
[/quote]
[code]
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();
[/code]
这样我在我的代码中加了versioned关键字:
[code]
Query query = session.createQuery("update versioned Test set name = name||id where id>0");
query.executeUpdate();
[/code]
但系统会抛出异常为不合法的语句,不清楚问题出在哪里,请大家看看,而且这样进行批处理的一个操作当其中有数据库正在修改的时候version已经改变变了会不会在批处理进行提交时候抛出异常也就是说在批处理的时候乐观锁是否依然可以生效!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值