0

我了解 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 但它仍然没有帮助。

我的 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() 吗?为什么没有它没有记录在数据库中保存/更新?

4

3 回答 3

0

刷新只是与数据库同步,然后您需要提交或清除会话以查看更改。

如果你只是提交。它会自动刷新,你也可以从另一个会话中看到你的更改。

Commit 将使数据库提交

刷新是将底层持久存储与内存中保存的持久状态同步的过程。

IE。它会在正在运行的事务中更新或插入到您的表中,但它可能不会提交这些更改(这取决于您的刷新模式)。

于 2013-02-20T05:28:46.687 回答
0

您确定没有在数据库中创建记录吗?如果您这么说是因为返回的 id 为空,那么我认为您误解了。当您调用 saveOrUpdate 时,该对象将存储在 Hibernate 会话中,并且运行查询的其他代码可以检索它,但它不一定会立即持久化到数据库中。在您运行提示 Hibernate 将对象持久保存到数据库的查询或手动调用 flush() 之前,当前对象实例不会有 id。

如果您编写第二种方法来查询对象,我建议您检查行为是什么。我想你会发现这会导致 Hibernate 将对象刷新到数据库中。

于 2013-02-19T23:00:09.377 回答
0

一旦从数据库加载或保存参数“registration”可能不会更改。当缓存对象和数据库数据之间存在差异时,Hibernate 将保存/更新实体。

修改“注册”实例中的字段之一后尝试。

此外,最好打开 Hibernate/Spring 调试日志并查看引擎盖下发生了什么。

于 2013-02-19T23:29:25.393 回答