在hbm.xml文件里面已经配置了
......
<version column="VERSION_NUM" name="versionNum" type="integer" unsaved-value="null"> </version>
xml 片段
- <"VERSION_NUM" name="versionNum" type="integer" unsaved-value="null"/>
......
问题是这样的,, 我要update一个表, 比如是 User表, 我第一步就先去出来记录user1, 然后将user1里面的对应的值set到页面的form中, 其中也包括user1当时取出来的version number. 比如说有两个人(张三, 李四)同时修改user1这条记录, 再假设user1这个记录开始的version number是4.
张三 先取出来user1记录想要进行update操作, 这时候数据库中user1的version number是4, 并且user1取到页面form中的version number 值也是4.
然后 李四也取出来了 user1记录, 同样 user1在数据库中的version number也是4, 取到页面表单中的version 值也是4. 不过李四先过张三提交了修改. 经过李四修改后, 数据库中的version number已经变成了5.
如果现在张三提交修改,按照道理应该是不可以成功的..不过我代码如下面这样写却不行,, 我只能显式的调用 session.merge() 方法才行..
我的code
java 代码
- UserVO userPO = userDAO.getByPk(user.getId());
- userPO.setUserName = user.getUserName();
- ......
- userPO.setVersionNum(user.getVersionNum());
-
- roleDAO.flush();
如果向上面这样的代码,, 张三还是可以update成功,, 比较想不通, 难道hibernate不知道用我给的version number先去 check一下??
不过我如果把上面的roleDAO.flush();改成 roleDAO.merge(userPO); 就可以用我给的version先check了.. 真是搞不通了... 不知道各位在用hibernate的时候这种情况是怎么处理的.. 给我一点建议吧.. 谢谢
分享到:
相关推荐
1. **显式调用**:开发人员可以直接调用`session.flush()`方法来强制执行Flush操作。 2. **事务提交**:在事务的提交阶段,为了确保数据的一致性和持久性,Hibernate会自动进行Flush操作。 3. **查询执行前**:当...
当达到特定条件或手动调用`Session.flush()`时,Hibernate会将这些变更持久化到数据库。 Flush过程主要包括以下步骤: 1. **对象状态检查**:Hibernate会检查Session中的所有对象,判断它们是否需要被更新、插入...
1. **自动flush模式**:默认情况下,`Session`会在一个事务提交前自动调用`flush()`。但是,如果需要在特定时刻强制同步,可以手动调用此方法。 2. **脏检查**:`flush()`过程会进行脏检查,对比对象在内存中的状态...
在默认情况下,Hibernate会在事务提交前自动调用`flush`,但有时我们需要手动调用它以确保数据及时写入数据库。然而,过度使用`flush`可能会导致事务的完整性受损,因为它可能在不适当的时间点更新数据,从而引发...
- 在没有调用`flush()`的情况下,即使对象被修改,Hibernate也不会立即与数据库交互,除非到达了上述自动flush的条件。 - 当调用`flush()`时,Hibernate会将缓存中的更改转化为SQL语句,然后发送给数据库执行,但...
10. **JDBC批处理API**: Hibernate底层使用JDBC的批处理API(Statement.addBatch()和Statement.executeBatch()),用户也可以直接使用JDBC批处理,绕过Hibernate的部分逻辑,获取更高的性能。 11. **性能优化注意...
在Java的Hibernate框架中,一级缓存是Session对象内置的缓存机制,它的存在是为了优化数据库操作,减少对数据库的直接访问,从而提高应用程序的性能。一级缓存的生命周期与Session对象相同,也就是说,只要Session...
《关于Hibernate矿建:深入理解Hibernate框架》 Hibernate,作为Java世界中一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作,使得开发者能够更专注于业务逻辑,而非底层的SQL语句。本篇文章将深入探讨...
以下是一些关于如何在Hibernate环境下优化批量数据处理的策略。 首先,了解问题的根源。在上述例子中,当尝试向数据库插入100,000条数据时,由于默认情况下Hibernate会将所有持久化对象保留在一级缓存中,随着数据...
在使用Hibernate进行数据库操作时,有时我们不希望实体类的任何改变都会自动同步到数据库,而是需要手动控制更新。这通常发生在我们希望优化性能,或者避免意外修改数据的情况下。本篇文档将深入探讨如何解决...
记得每次操作后都要调用`flush()`和`close()`方法。 **二、Eclipse自动生成配置** 1. **新建Hibernate项目** 在Eclipse中创建一个新的Java项目,然后通过Hibernate插件将其设置为Hibernate项目。 2. **添加依赖*...
因此,在批量更新时,需要定期调用 `session.flush()` 和 `session.clear()` 来清除一级缓存。 批量抓取 Hibernate 的批量抓取机制允许将多个INSERT 语句合并成一个批量插入语句,从而提高性能。在 Hibernate 配置...
### 详解Hibernate事务处理机制 #### 一、引言 Hibernate作为一款优秀的对象关系映射(ORM)框架,在Java开发领域扮演着极其重要的角色。它不仅简化了数据持久化的复杂性,还提供了一系列强大的功能来支持高效的...
9. **增强型实体**:Hibernate 5引入了代理实体(Enhanced Entity),使得无须使用Hibernate的API就能直接获取到懒加载的关联对象,提升了开发体验。 在“hibernate-release-5.2.15.Final”压缩包中,除了核心的jar...
- 默认情况下,Hibernate 每次执行一条 SQL 语句后都会自动提交事务。 - **批量处理** - 可以通过设置 `batch_size` 属性来控制批处理的数量。 - 示例: ```java session.getTransaction().begin(); for (int ...
而在事务提交(`Transaction.commit()`)时,Hibernate会自动执行flush操作。 3. **缓存查询**:当从数据库中查询数据时,Hibernate首先会在一级缓存中查找,如果找到则直接返回,无需再次访问数据库,这大大提升了...
### 关于flush和evict在Hibernate中的应用 #### 一、引言 在持久层框架Hibernate中,`flush()`和`evict()`方法是开发者在处理数据时经常会遇到的两个重要概念。它们对于理解Hibernate的工作机制及其缓存管理至关...
总结来说,Hibernate的更新操作主要包括配置、创建SessionFactory、打开Session、查询数据、修改对象、调用flush()提交更改,最后关闭Session和SessionFactory。这个过程确保了数据的一致性和事务的管理,是...