Hibernate的问题 ---- session.setFlushMode(FlushMode.COMMIT)设置提交来解决

晚上遇到的问题是这样子的,有一个对象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,工作还需要再细心些。

你可能感兴趣的:(spring,Hibernate,工作)