据我所知,Hibernate的Session.flush()方法将内存中的当前数据状态写入数据库。我用它,它工作正常。但我的问题是:使用Session.flush()是强制性的吗?
如果我删除Session.flush(),则数据库中不会插入/更新任何内容。我在日志文件中看不到任何错误。
我在我的应用程序中使用Spring + Hibernate。我也在使用我在web.xml中定义的OpenSessionInViewFilter,如下所示:
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>flushMode</param-name>
<param-value>AUTO</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
我已尝试将flushMode用作COMMIT,但仍无法提供帮助。
My Spring applicationContext.xml具有以下数据源行:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="${jdbc.jndiName}" />
<property name="resourceRef" value="true" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>...</value>
</list>
</property>
</bean>
最后我的代码片段如下所示:
public String saveRegistration (final Registration registration) {
getHibernateTemplate().saveOrUpdate(registration);
getSession().flush(); // If I remove this, no records would be inserted/updated!!
String id = registration.getId();
return id;
}
正如您所看到的,我在Spring和Hibernate中使用了非常基本的配置。
有人可以帮助我理解为什么应该调用getSession.flush()吗?为什么没有它没有记录在数据库中保存/更新?
答案 0 :(得分:0)
您确定数据库中没有创建记录吗?如果你这样说,因为返回的id是null,那么我认为你误解了。当您调用saveOrUpdate时,该对象将存储在Hibernate会话中,而运行查询的其他代码可以检索它,但它不一定会立即持久存储到数据库。在您运行提示Hibernate将对象持久保存到数据库的查询,或者您手动调用flush()之前,当前对象实例将没有id。
如果您编写第二个查询对象的方法,我建议您检查行为是什么。我想你会发现这会导致Hibernate将对象刷新到数据库。
答案 1 :(得分:0)
从数据库加载或保存后,参数“注册”可能没有更改。当缓存对象和数据库数据之间存在一些差异时,Hibernate将保存/更新实体。
在“注册”实例中修改其中一个字段后尝试。
此外,最好打开Hibernate / Spring调试日志记录,看看幕后发生了什么。
答案 2 :(得分:0)
flush只是与db同步,然后你需要提交或清除会话以查看更改。
如果您只是提交。它会自动刷新,您也可以从其他会话中看到您的更改。
刷新是同步底层持久性的过程 持久存在的商店。
即。它将在运行中更新或插入到表中 事务,但可能不提交这些更改(这取决于 你的冲洗模式)。