`
damies
  • 浏览: 238456 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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

阅读更多
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已经改变变了会不会在批处理进行提交时候抛出异常也就是说在批处理的时候乐观锁是否依然可以生效!
分享到:
评论
4 楼 dwangel 2007-01-22  
这个帖子正规多了,比较容易找问题了。

不过,Exception还是要帖出来啊,exception里的包含的信息往往能帮助debug。
3 楼 eyejava 2007-01-21  
翻译出来的sql拿去执行都没有问题 怎么还会报语句错误。exception贴上来看看
2 楼 damies 2007-01-21  
||是没问题的.标准SQL也是支持的测试也通过..语句没问题...主要是同步的问题.
1 楼 eyejava 2007-01-19  
什么数据库? ||  测试通过吗? hibernate翻译出来的sql有没有问题呢?

相关推荐

    3DML开源说明书-v1.0.11

    《3DML开源说明书-v1.0.11》详细解析 3DML,全称为三维标记语言(Three Dimensional Markup Language),是由泰瑞数创科技(北京)有限公司开发的一种专为传输和浏览大规模3D空间数据而设计的格式。该格式基于开源...

    Hibernate Developer Guide

    同时介绍了StatelessSession和Hibernate查询语言(HQL)用于DML操作。 ### 锁机制 Hibernate中的锁机制用来管理并发事务,以确保数据的一致性。文档详细讲解了乐观锁和悲观锁的实现,包括版本号和时间戳机制。 ###...

    Hibernate总结

    批量删除或更新操作可以通过HQL(Hibernate Query Language)实现,这是一种类似于SQL的语言,专门用于Hibernate框架的数据操作。使用HQL可以更灵活地构建复杂的查询和更新语句,提高数据处理效率。 ### 4. ...

    批量更新删除插入SOURCEDATA.dml_task.zip_分批处理

    在数据库管理中,批量操作是常见的优化策略,特别是在大数据量的场景下,它可以显著提高效率并减少资源消耗。批量更新、删除和插入是这类操作的关键组成部分。标题中的“批量更新删除插入SOURCEDATA.dml_task.zip_...

    分别使用Hibernate和JDBC操作数据库

    4. **持久化操作**:使用Session的`save()`, `update()`, `delete()` 和 `get()` 方法进行CRUD操作,或者使用`createQuery()`或`createCriteria()`执行HQL(Hibernate Query Language)查询。 5. **事务处理**:...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     9.4.3 通过HQL来进行批量操作  9.4.4 直接通过JDBC API来进行批量操作  9.5 使用元数据  9.6 通过Hibernate调用存储过程  9.7 小结  9.8 思考题 第10章 映射组成关系  10.1 建立精粒度对象模型  10.2 建立...

    oracle操作数据DML语句.ppt

    同时,DML 语句也可以对数据库中的数据进行批量操作,提高工作效率和生产力。 在学习 Oracle 操作数据 DML 语句时,需要了解其基本语法和应用场景,包括插入、更新和删除数据的语法和示例。 1. 插入数据(INSERT...

    在SELECT语句中调用DML函数

    在数据库管理领域,数据操纵语言(Data Manipulation Language,简称DML)是SQL语言中用于操作数据的关键组成部分,包括插入(INSERT)、更新(UPDATE)、删除(DELETE)等语句。然而,在传统观念中,SELECT语句主要...

    最新 hibernate.4.1.6.Final devguide pdf版

    此外,Hibernate Query Language(HQL)也得到了增强,特别是在 DML 方面,支持了 UPDATE 和 DELETE 操作的 HQL 语法,以及 IN 子句的使用,这些都极大地丰富了数据操作的表达力。 #### 结论 综上所述,Hibernate ...

    ORACLE中查找定位表最后DML操作的时间小结

    在Oracle数据库中,如何查找,定位一张表最后一次的DML操作的时间呢? 方式有三种,不过都有一些局限性,下面简单的解析、总结一下。 1:使用ORA_ROWSCN伪列获取表最后的DML时间  ORA_ROWSCN伪列是Oracle 10g开始...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     9.4.3 通过HQL来进行批量操作  9.4.4 直接通过JDBC API来进行批量操作  9.5 使用元数据  9.6 通过Hibernate调用存储过程  9.7 小结  9.8 思考题 第10章 映射组成关系  10.1 建立精粒度对象模型  10.2 建立...

    hibernate3.6 文档(pdf 格式)

    - **DML 风格操作**:展示如何使用类似 DML 的风格执行批量操作。 #### 十六、HQL:Hibernate 查询语言 - **大小写敏感性**:解释 HQL 是否区分大小写。 - **from 子句**:介绍如何使用 from 子句指定查询的起点。 ...

    瀚高数据库hibernate方言 hgdb-hibernate-dialect

    瀚高数据库Hibernate方言是针对瀚高数据库(HighGo Database)设计的一种特定的方言实现,用于在Java应用程序中通过Hibernate框架与瀚高数据库进行交互。Hibernate是一个流行的对象关系映射(ORM)工具,它允许开发者...

    Hibernate 参数设置一览表.doc

    3. **hibernate.jdbc.batch_versioned_data**:当开启时,Hibernate会为自动版本化的数据使用批量DML操作,以提高性能。 4. **hibernate.jdbc.factory_class**:允许自定义Batcher实现,但大多数情况下无需更改默认...

    hibernate课程源码.

    6. **011_Hibernate_DML**: DML(Data Manipulation Language)操作包括插入、更新和删除数据库记录。这部分可能包含了使用Hibernate执行DML操作的示例。 7. **013_Struts_Hibernate**: Struts是一个流行的MVC框架...

    hive 表 dml 操作.zip

    在这个“hive 表 DML 操作.zip”压缩包中,我们关注的是Hive对数据操作的语言特性,特别是DML(Data Manipulation Language),即数据操纵语言。在Hive中,DML主要包括INSERT、UPDATE、DELETE以及SELECT等操作,但...

    DML练习:UPDATE,DELETE,INSERT操作 数据库实验报告

    这篇实验报告主要涉及了数据库管理系统的数据操作,包括DML(Data Manipulation Language)的三大基本操作:UPDATE、DELETE和INSERT。这些操作是数据库管理中不可或缺的部分,用于更新、删除和添加数据记录。 1. ...

Global site tag (gtag.js) - Google Analytics