4

Webアプリケーションを大幅にアップグレードしました。jboss4からjboss7にジャンプしました。hibernate3からhibernate4にも移行しました。

私はこの奇妙な振る舞いに遭遇しました(休止状態3では発生しませんでした):1。hqlを実行し(hqlがステータスフィールドをフィルタリングするとします-status = 1)、1つのオブジェクトを取り戻します。2.ステータスを2に変更します。3。hqlを再度実行して、同じオブジェクト(ステータスが変更された同じインスタンスでも!)を取得します。これは、基準に一致しなくなりました。

問題は、クエリの前にセッションが自動的にフラッシュされないことであることがわかりました。セッションにflushmode.autoがあるため、これは奇妙です。

誰かが助けることができますか?

4

2 に答える 2

3

フラッシュ モードを適切な値に明示的に設定してみてください。他のモードも使用できます。

session.setFlushMode(FlushMode.ALWAYS); 

また、手動でフラッシュすることもできますsession.flush()

ドキュメントから:

  • ALWAYS :セッションはすべてのクエリの前にフラッシュされます。

  • AUTO :クエリが古い状態を返さないようにするために、クエリの実行前にセッションがフラッシュされることがあります。

(私の部分からの強調)


編集:アプリケーションレベルでの適用は試していませんが、persistence.xmlで指定できます

<property name="org.hibernate.FlushMode" value="always" />

そして hibernate.cfg.xml で

<property name="hibernate.flushMode">ALWAYS</property>
于 2013-01-09T08:10:17.577 に答える
3

問題が見つかりました。それはトランザクション ファクトリ クラス (プロパティ名 - hibernate.transaction.factory_class) でした。基本的には、JtaTransactionFactory が構成された JTA シナリオでは、hibernate はそれがトランザクション内にあることを検出しないため、中間フラッシュを実行しないという事実に帰着します。org.hibernate.transaction.CMTTransactionFactory に変更すると、すべてが機能します。

于 2013-03-13T14:02:04.790 に答える