我想了解我所看到的反直觉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();
为什么?
答案 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语句,因此它返回空结果集。