为什么hibernate在select查询(EmptyInterceptor)上刷新?

时间:2012-10-30 15:49:04

标签: spring hibernate readonly interceptor flush

我想了解我所看到的反直觉Hibernate行为。我一直认为“刷新”意味着hibernate在内存中有一个必须写入数据库的数据结构。这不是我所看到的。

我创建了以下拦截器:

public class FeedInterceptor extends EmptyInterceptor
{
    @Override
    public void postFlush(Iterator entities)
    {
          System.out.println("postFlush");          
    }
}

在我的ApplicationContext中注册它

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
   <property name="entityInterceptor">
      <bean class="interceptor.FeedInterceptor"/>
   </property>
</bean>

但是,奇怪的是,我看到从我的DAO从DB中检索到的每一行都写入了“postFlush”:

Session session = sessionFactory.getCurrentSession();
Query query = session.createQuery("from Feed feed");
query.list();

为什么?

1 个答案:

答案 0 :(得分:3)

假设Hibernate不会刷新会话,那么您可能会遇到以下情况:

Person p = new Person();
p.setName("Pomario");
dao.create(p);
Person pomario = dao.findPersonByName("Pomario")
//pomario is null?

当按名称查找某个人时,hibernate会向数据库发出一个select语句。如果它不首先发送先前的语句,则返回的结果可能与先前在会话中已完成的更改不一致,此处dababase尚未收到create语句,因此它返回空结果集。