晚上遇到的问题是这样子的,有一个对象Document,用Spring的HibernateTemplate load之后,我设置了这个对象的一个属性,例如一个叫做md5的属性,代码如下:
...开始事务
Document doc = hTemplate.load(new Interger(documenId),Document.class);
String content = doc.getContent();
String md5 = MD5.get(content);//计算文档内容的md5值
doc.setMd5(md5);
/*
getDocumentByMd5 的定义 :select doc.id from Document doc where doc.md5=:md5
在查询之前,数据库里的md5是惟一的,没有md5码相同的Document
*/
List list = hTemplate.getHibernateTemplate().findByNamedQueryAndNamedParam("getDocumentByMd5",
"md5", md5);
....结束事务
返回的list结果的里按照我的思维应该是空的,但是结果是返回的list的第一个元素的值就是doc的对象id。
按理讲程序的事务还没有提交,doc也没有被update,怎么就会查出结果了呢?太奇怪了。
研究了一下Hibernate2.17c的SessionImpl源代码,发现下面的注释,在作查询前,Hibernate要先检测在查询语句中出现的表涉及的对象是否被修改过,如果被修改过,那么先提交这些修改,之后再查询。这也解释了为什么刚修改过的对象,还没有提交修改,就在查询结果出查出来了。
/**
* detect in-memory changes, determine if the changes are to tables
* named in the query and, if so, complete execution the flush
*/
private boolean autoFlushIfRequired(Set querySpaces)
注:上面说到的Hibernate的问题可以通过session.setFlushMode(FlushMode.COMMIT)设置提交来解决
Hibernate有四种FlushMode:NEVER,COMMIT,AUTO,ALWAYS,默认是AUTO,工作还需要再细心些。
分享到:
相关推荐
`Session` 可以通过 `setFlushMode()` 方法来设置清理缓存的时间点,`FlushMode` 类定义了以下几种清理模式: - **FlushMode.AUTO**:自动清理缓存,默认值。在执行查询操作、提交事务或显式调用 `flush()` 方法时...
#### 四、整合中常见的问题及解决方法 **4.1 使用Myeclipse整合时在工程中加入各框架的顺序** 当使用MyEclipse进行整合开发时,建议按照以下顺序添加各个框架的库文件: 1. 添加Struts相关的库文件。 2. 添加...
通过上述对几个常见 Hibernate 错误的解析及解决方法的介绍,我们可以发现大部分问题都与配置文件的设置、实体类的定义以及事务管理有关。在日常开发中,我们应该注意这些细节,以避免不必要的错误发生。同时,对于...
### 使用Spring引起的错误:Write ...通过以上解决方案和配置示例,可以有效地解决在使用Spring框架和Hibernate时出现的“Write operations are not allowed in read-only mode (FlushMode.NEVER)”这一问题。
- **FlushMode**: 控制Session何时执行flush操作。 #### 五、级联操作 - **级联保存**(cascade save): 在保存一个对象时,同时保存其关联对象。 - **级联删除**(cascade delete): 删除一个对象时,同时删除其关联...
4. **设置FlushMode**:可以通过设置`SessionFactory`或`Session`的`FlushMode`来控制何时进行脏检查和更新。例如,你可以将模式设置为`FlushMode.MANUAL`,这样就不会自动更新了,除非你显式调用`flush()`。 5. **...
- 使用批处理操作,通过`Session`的`flushMode`和` batchSize`设置优化性能。 通过以上步骤,你可以在NetBeans中高效地利用Hibernate进行数据操作。这个过程简化了数据库操作,使得开发者可以专注于业务逻辑,而...
- 如:设置`setFlushMode(FlushMode.COMMIT)`来控制批量提交行为。 5. **性能优化** - 包括索引优化、查询优化等多方面。 - 使用Hibernate提供的工具和技术来提升应用的整体性能。 #### 五、实战案例 - **用户...
因为`Open Session In View`默认采用`FlushMode.NEVER`,这意味着Hibernate不会自动刷新session来同步数据库的变化。为了避免这个问题,可以采取以下几种解决办法: 1. **更改Flush Mode**:将`FlushMode`设置为`...
在Java世界中,Hibernate 提供了一种在对象模型和关系数据库之间进行转换的机制,使得开发人员可以使用面向对象的方式来处理数据库操作,而无需直接编写SQL语句。 ### 1. Hibernate核心概念 - **实体(Entity)**:...
- 使用批处理:通过`flushMode`和`batch-size`设置,可以批量处理多个操作,提高效率。 - 只获取必要的数据:避免加载整个实体,使用`select new`构造函数或`fetch`属性限制关联关系的加载。 - 利用缓存:根据...
- 使用Session的flushMode设置控制何时将脏数据同步到数据库。 8. 链接其他技术: - Spring框架集成:Spring提供了对Hibernate的支持,简化了配置和事务管理。 - JPA集成:Hibernate作为JPA的实现,可以使用JPA...
4. **会话管理**:Hibernate的Session提供了beginTransaction、commit和rollback方法,用于处理事务。Session的save、update和delete方法用于对象的持久化操作。FlushMode和CacheMode则控制了Session何时将数据同步...
这个过滤器确保在每次HTTP请求中,都会有一个打开的Hibernate Session,以解决“懒加载”问题。配置中包含了`sessionFactoryBeanName`、`singleSession`和`flushMode`等参数,用于指定SessionFactory的bean名称、...
**hibernate二级缓存详解** 在Java的持久化框架Hibernate中,缓存是一种重要的优化手段,它能够显著提升数据库操作的效率。本项目提供的工程示例深入探讨了Hibernate的一级缓存和二级缓存机制,并通过实际运行验证...
例如,`Session.flushMode()`和`Session.setBatchSize()`方法。 2. 延迟加载:Hibernate的懒加载机制可以降低内存消耗,但过多的延迟加载可能导致大量小查询,增加数据库压力。合理设计实体关系,适时使用立即加载...
- Transaction的`commit()`调用:在提交事务前,若设置为`FlushMode.COMMIT`或`AUTO`,Session会先清除缓存,再执行SQL提交事务。 - 查询操作:`find()`或`iterate()`时,如果对象属性有变动,会先清理缓存以更新...
在"Hibernate_demo"中,我们会看到配置文件(如hibernate.cfg.xml),这里包含了数据库连接信息、方言选择、缓存配置等关键设置。此外,还需要在pom.xml或build.gradle文件中添加Hibernate5的依赖库。 四、实战操作...
### Hibernate中Criteria的完整用法 #### 一、概述 在Hibernate框架中,`Criteria`是一种非常实用且灵活的对象查询方式。它允许开发者通过构造一个`Criteria`对象来定义复杂的查询逻辑,从而实现对数据库中数据的...