浏览 5967 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-01-19
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已经改变变了会不会在批处理进行提交时候抛出异常也就是说在批处理的时候乐观锁是否依然可以生效! 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-01-19
什么数据库? || 测试通过吗? hibernate翻译出来的sql有没有问题呢?
|
|
返回顶楼 | |
发表时间:2007-01-21
||是没问题的.标准SQL也是支持的测试也通过..语句没问题...主要是同步的问题.
|
|
返回顶楼 | |
发表时间:2007-01-21
翻译出来的sql拿去执行都没有问题 怎么还会报语句错误。exception贴上来看看
|
|
返回顶楼 | |
发表时间:2007-01-22
这个帖子正规多了,比较容易找问题了。
不过,Exception还是要帖出来啊,exception里的包含的信息往往能帮助debug。 |
|
返回顶楼 | |