1

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

我创建了以下拦截器:

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 中从数据库中检索到的每一行都写入控制台的“postFlush”:

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

这是为什么?

4

1 回答 1

4

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

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

当通过名字查找一个人时,hibernate 会向数据库发出一个 select 语句。如果它没有先发送之前的语句,那么返回的结果可能与之前在会话中所做的更改不一致,这里dababase还没有收到create语句,所以它返回一个空的结果集。

于 2012-10-30T17:11:45.003 回答