我知道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作为提交,但仍然没有帮助。
我的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()吗?为什么没有它就不会在数据库中保存/更新任何记录?
发布于 2013-02-20 07:00:09
您确定没有在数据库中创建任何记录吗?如果你这么说是因为返回的id为空,那么我认为你误解了。当您调用saveOrUpdate时,对象将存储在Hibernate会话中,其他运行查询的代码可以检索它,但是它不一定会立即持久化到数据库中。直到您运行一个提示Hibernate将对象持久化到数据库的查询,或者手动调用flush(),当前对象实例才会有id。
如果您编写第二个方法来查询对象,我建议您检查行为是什么。我想你会发现这会导致Hibernate将对象刷新到数据库中。
发布于 2013-02-20 07:29:25
可能参数“注册”在从数据库加载或保存后不会更改。当缓存对象和数据库数据之间存在一些差异时,Hibernate会保存/更新实体。
请在注册实例中修改其中一个字段后重试。
此外,打开Hibernate/Spring调试日志并查看幕后发生的事情也是一个好主意。
发布于 2013-02-20 13:28:47
刷新只是与数据库同步,然后您需要提交或清除会话才能看到更改。
如果你提交了,.It会自动刷新,你也可以从另一个会话中看到你的更改。
提交将使数据库提交
刷新是将底层持久化存储与内存中的持久化状态同步的过程。
即。它将更新或插入正在运行的事务中的表,但可能不会提交这些更改(这取决于您的刷新模式)。
https://stackoverflow.com/questions/14967302
复制相似问题