Hibernate flush()方法混乱

时间:2013-02-19 20:59:35

标签: java spring hibernate

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

3 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分:0)

从数据库加载或保存后,参数“注册”可能没有更改。当缓存对象和数据库数据之间存在一些差异时,Hibernate将保存/更新实体。

在“注册”实例中修改其中一个字段后尝试。

此外,最好打开Hibernate / Spring调试日志记录,看看幕后发生了什么。

答案 2 :(得分:0)

flush只是与db同步,然后你需要提交或清除会话以查看更改。

如果您只是提交。它会自动刷新,您也可以从其他会话中看到您的更改。

提交将使数据库提交

刷新是同步底层持久性的过程 持久存在的商店。

即。它将在运行中更新或插入到表中 事务,但可能不提交这些更改(这取决于 你的冲洗模式)。