首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Hibernate flush()方法混淆

Hibernate flush()方法混淆
EN

Stack Overflow用户
提问于 2013-02-20 04:59:35
回答 3查看 2.8K关注 0票数 0

我知道Hibernate的Session.flush()方法将内存中的当前数据状态写入数据库。我使用它,它工作得很好。但我的问题是:使用Session.flush()是强制性的吗?

如果删除Session.flush(),则数据库中不会插入/更新任何内容。并且在我的日志文件中没有看到任何错误。

我在我的应用程序中使用Spring + Hibernate。我还使用了我在web.xml中定义的OpenSessionInViewFilter,如下所示:

代码语言:javascript
复制
<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有以下几行数据源:

代码语言:javascript
复制
<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>

最后,我的代码片段如下所示:

代码语言:javascript
复制
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()吗?为什么没有它就不会在数据库中保存/更新任何记录?

EN

回答 3

Stack Overflow用户

发布于 2013-02-20 07:00:09

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

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

票数 0
EN

Stack Overflow用户

发布于 2013-02-20 07:29:25

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

请在注册实例中修改其中一个字段后重试。

此外,打开Hibernate/Spring调试日志并查看幕后发生的事情也是一个好主意。

票数 0
EN

Stack Overflow用户

发布于 2013-02-20 13:28:47

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

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

提交将使数据库提交

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14967302

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档