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

フラッシュはデータベースとの同期であり、変更を確認するにはセッションをコミットまたはクリアする必要があります。

コミットするだけで、自動的にフラッシュされ、別のセッションからの変更も確認できます。

コミットはデータベースをコミットします

フラッシュは、基になる永続ストアを、メモリに保持されている永続状態と同期するプロセスです。

すなわち。実行中のトランザクションでテーブルを更新または挿入しますが、それらの変更をコミットしない場合があります (これはフラッシュ モードによって異なります)。

于 2013-02-20T05:28:46.687 に答える
0

データベースにレコードが作成されないことを確信していますか? 返された id が null であるためと言っている場合は、誤解していると思います。saveOrUpdate を呼び出すと、オブジェクトは Hibernate セッションに保存され、クエリを実行する他のコードはそれを取得できますが、データベースにすぐに永続化されるとは限りません。Hibernate にオブジェクトをデータベースに永続化させるクエリを実行するか、手動で flush() を呼び出すまで、現在のオブジェクト インスタンスには ID がありません。

オブジェクトを照会する 2 番目のメソッドをコーディングした場合の動作を確認することをお勧めします。これにより、Hibernate がオブジェクトをデータベースにフラッシュすることがわかると思います。

于 2013-02-19T23:00:09.377 に答える
0

おそらく、パラメータ「登録」は、データベースからロードまたは保存されると変更されていません。Hibernate は、キャッシュされたオブジェクトとデータベース データに違いがある場合にエンティティを保存/更新します。

「登録」インスタンスのフィールドの 1 つを変更してから試してください。

また、Hibernate/Spring のデバッグ ログを有効にして、内部で何が起こっているかを確認することをお勧めします。

于 2013-02-19T23:29:25.393 に答える