問題タブ [staleobjectstate]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - オブジェクトを更新した後のStaleObjectStateException
セッションをコミットしようとして、別のユーザーも同じオブジェクトを変更すると、Hibernateは。をスローしStaleObjectStateException
ます。
その例外から回復しようとすると、次のように呼び出します。
session.refresh(<staleObject>)
次に、以前に失敗したコミットをもう一度呼び出します。しかし、staleObjectStateException
同じオブジェクトでもう一度発生します。他のユーザーによる変更がない場合でも、オブジェクトのバージョン番号がDBのバージョン番号と同じであることも確認しました。
誰が何が間違っているのか知っていますか?新しいセッションを閉じたり開いたりせずに例外を適切に処理する方法について、誰かがより良いアイデアを持っていますか?
注:デスクトップ(RCP)アプリケーションには、ビューごとに1つのセッションを使用します
winforms - NHibernateを使用したWinformsでの制約違反の処理
ユーザーがWindowsフォームアプリケーションのデータベースからオブジェクトを編集し、データベースの制約(つまり、列の一意の値)に違反する編集を行い、エンティティをデータベースに保存し、NHibernateがスローする場合を処理したいと思います。したがって、例外がセッションを破棄します。
私は、MSDNの記事「NHibernateを使用したデスクトップTo-Doアプリケーションの構築」で公開されているガイダンスを使用し、プレゼンター/フォームごとのセッションアプローチを使用しています。プレゼンターの作成時に、SessionFactoryへの参照を保持し、新しいセッションを作成し、セッションを介してデータベースからオブジェクトを取得し、それへの参照を保存します[オブジェクト]。フォームが表示されると、そのフィールドはオブジェクトから入力されます。
フォームに変更が加えられ、ユーザーがデータを保存したい場合、オブジェクトはフィールド値から更新され、オブジェクトはデータベースに保存されます。
オブジェクトがデータベースから取得されてから保存されるまでの間にオブジェクトが変更される古い状態の例外を処理します。新しいセッションが作成され、元のオブジェクトが再度読み込まれ、競合が発生したことがユーザーに通知され、彼の変更と現在データベースにあるものが表示されます。彼は自分の変更を保存するかキャンセルするかを選択できます(そして現在データベースに保存されているものを受け入れることができます)。
制約違反が発生した場合、次の2つのいずれかが発生する可能性があります。
- オブジェクトは、新しいセッションに再ロードできるデータベースで変更されていません。
- オブジェクトもデータベースで変更され、最初にロードされたものを反映しなくなりました。
ただし、制約例外が発生したために失効状態の例外がスローされることはないため、実際にどのケースが発生したかを検出できるとは思いません(これをテストしました)。
ケース1の処理は簡単です。「FIELD-XにはすでにDBにある値があります」というエラーメッセージを表示し、何も悪いことが起こっていないふりをすることができるからです。ユーザーはFIELD-Xを一意の値に変更し、変更を再入力せずに再度保存できます。
ケース2の処理は、通常の失効状態の例外の処理に似ています。
元の値(またはその値)のコピーを保持し、2つのフィールドをフィールドごとに比較することで、これを「ブルートフォース」できることを私は知っています。ただし、NHibernateを活用することでこれを処理するためのより良い方法があると思います。 これをどのように処理しますか?
役立つ場合:
- NHibernateバージョン:3.2
- 楽観的-「ダーティ」戦略を使用したロック
- .NET Framework 2.0 SP2
- SQLiteデータベース/ドライバー
2月23日編集-私が現在行っていることをよりよく説明するために、いくつかのサンプルコードを追加しました。
hibernate - Hibernate/JPA @Version および @Generated により StaleObjectStateException が発生する
Hibernate 4.1.0 が提供する Spring 3.1/JPA 2 を使用します。
基本的な監査機能 (更新タイムスタンプ、バージョン番号など) を提供するすべてのエンティティの基本クラスがあります。他のアプリケーションがデータベースにアクセスするため、これらはトリガーを介して設定する必要があります。
私のマッピングは次のようになります。
このorg.hibernate.engine.internal.increment(...)
メソッドは、トランザクションをコミットするときに常に呼び出され、StaleObjectStateException
.
奇妙なことGenerationTime.NEVER
に、バージョン列を設定すると、休止状態は引き続きバージョンをインクリメントしますが、適切に持続します。問題は、データベースのバージョンが更新されない場合 (テーブルに変更がない場合など) であっても、マージから返されるバージョンがデータベースの値よりも 1 高くなり、その後の保存で明らかに問題が発生することです。
私の期待は、GenerationTime.ALWAYS
休止状態にバージョンをインクリメントしようとせず、データベースに依存してそうするように指示し、次に挿入/更新後に更新された値を選択することです。
私の理解と実装のどこが間違っているのか、誰か教えてもらえますか?
c# - NHibernate、削除後にエンティティをロードすると古い状態の例外が発生するのはなぜですか?
バッチで処理されているItemエンティティのリストがあります。次のようなものです。
問題は、同じitemIdがItemIdListに複数回リストされる可能性があるため、アイテムを削除した後、アイテムをもう一度ロードしようとすると、ロードラインがエラーで失敗することです。
エンティティがもう存在しないことは理解していますが、get関数がnullを返すことを期待していました。これが私のgetById関数です:
SingleOrDefaultがnullを返さないのはなぜですか?
私のItemエンティティには自動生成されたキーが1つしかなく、ハッシュ関数は次のようになります。
編集:
これが私の削除方法です
java - ListView メソッドが「古いオブジェクト状態」例外をスローするのはなぜですか?
現在、アプリ内で、データベースから ListView を更新するメソッドを呼び出すと、古いオブジェクトの例外が発生します。
データベースにクエリを実行するときにすべてのカーソルを閉じるように注意しました。「startManagingCursor」を使用して返されたときにカーソルも管理しますが、それでもこの問題が発生します。
現時点では、データベースに新しい項目を追加するときに、クラスのプライベート メソッド内で ListView 更新メソッドを呼び出します。これは、オブジェクトが例外をスローしている場所です。
セッションを「更新」している人々について読んだことがありますが、データベースのバージョンがこれに含まれると思いますか? しかし、全体的に私は立ち往生しており、これを解決できません。
更新されたエラー:
02-13 13:23:06.588: E/AndroidRuntime(287): 致命的な例外: メイン 02-13 13:23:06.588: E/AndroidRuntime(287): android.database.StaleDataException: 閉じたカーソルにアクセスする 02-13 13: 23:06.588: E/AndroidRuntime(287): android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:217) 02-13 13:23:06.588: E/AndroidRuntime(287): android.database.AbstractWindowedCursor.getInt で(AbstractWindowedCursor.java:84) 02-13 13:23:06.588: E/AndroidRuntime(287): com.example.flybase2.ShoppingList.updateTotal(ShoppingList.java:248) 02-13 13:23:06.588: E /AndroidRuntime(287): com.example.flybase2.ShoppingList.access$1(ShoppingList.java:231) 02-13 13:23:06.588: E/AndroidRuntime(287): com.example.flybase2.ShoppingList$2. onClick(ShoppingList.java:350) 02-13 13:23:06.588: E/AndroidRuntime(287): com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:158) 02-13 13:23:06.588: E/AndroidRuntime(287): android.os.Handler.dispatchMessage(Handler.java:99) 02-13 13:23:06.588: E/AndroidRuntime(287): android.os.Looper.loop(Looper.java:123) 02-13 13:23:06.588: E/AndroidRuntime(287): android.app.ActivityThread で.main(ActivityThread.java:4627) 02-13 13:23:06.588: E/AndroidRuntime(287): java.lang.reflect.Method.invokeNative(ネイティブ メソッド) 02-13 13:23:06.588: E/ AndroidRuntime(287): java.lang.reflect.Method.invoke(Method.java:521) 02-13 13:23:06.588: E/AndroidRuntime(287): com.android.internal.os.ZygoteInit$MethodAndArgsCaller で.run(ZygoteInit.java:868) 02-13 13:23:06.588: E/AndroidRuntime(287): com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 02-13 13:23 :06.588:E/AndroidRuntime(287): dalvik.system.NativeStart.main(ネイティブメソッド)
これは、ListView を呼び出す私のクラスです。
これは、データベースから返されたカーソルです。
hibernate - StaleObjectExceptionですが、本当に奇妙です
私はアプリを継承しました。このアプリは、トリガーベースの挿入と更新を行い、StaleObjectExceptionをスローすることがあります。多くのデバッグ(tx、hibernate、typeなど)を追加しようとしたため、さらに混乱しました。
ログ、休止状態の挿入、およびデータにtx commitが表示され、実際、ID#290595のオブジェクトが値としてバインドされています。15:24:00にも同様の挿入がありますが、15:25:00まで、アプリは完全にサイレントです(ユーザーなし、その他のアクティビティなし)。
データベースのSQLクエリは、レコード#290595が実際には存在しないことを示しています。挿入から失敗まで4分あります。言うまでもなく、それは通常、ほとんどの日で機能しますが、突然....
トランザクションコミット時に休止状態が自動的にフラッシュしてコミットしませんか?
挿入によってデータがキャッシュに移動されたが、DBには移動されなかったと仮定します。これはキャッシュに再び見つかりましたが、DBにないため、更新を拒否します。だから問題は本当に誰かが素晴らしいアイデアを持っているかどうかです?
これはOracleDBであり、T2にRequired_newトランザクションがあり、isolation_levelがシリアル化されていることを確認しようとしましたが、ほとんど効果がありません。挿入が何らかの形でコミットされていないままになっていると思い始めています。
どんな提案も歓迎します
groovy - Geb の一般的な問題 (StaleElementReferenceException と待機タイムアウト)
「Book of Geb」に従って、ポータルの Web ページのマッピングを開始しました。私は、静的コンテンツ クロージャ ブロック内で定義された変数を使用し、後でページ メソッドでそれらにアクセスすることを好みます。
残念ながら、Geb 待機タイムアウト例外 (60 秒後) が発生したり、さらに悪いことに、よく知られている "StaleElementReferenceException" が発生したりすることがあります。
「isDisplayed」の代わりに「isEnabled」を使用すると、待機タイムアウトを回避できましたが、「StaleElementReferenceException」については、以下の解決策しか適用できませんでした。
この解決策はあまり良くないと思いますが、別の記事で説明されているように、明示的に待機することはできませんでした。したがって、いくつかの一般的な質問があります。
- ページが動的である場合、静的コンテンツ定義の使用を避けるべきですか?
- Geb が DOM をリフレッシュするのはいつですか? DOM リフレッシュをトリガーするにはどうすればよいですか?
- CSS セレクターを使用しているときに「StaleElementReferenceException」が引き続き発生するのはなぜですか?
この問題を理解または解決するのに役立つすべてのヒントをいただければ幸いです。私はまだ初心者なので、簡単なコード例を用意するのが最善です。ありがとうございました!
hibernate - Dynamic Finder (Hibernate) での Grails StaleObjectException
動的ファインダーで古いオブジェクトの例外を一貫してスローするバッチ ジョブがあります。この仕事のために ORM ソリューションを実行しないのが理想ですが、仕方がありません。例外は、FormulaBatchPopulatorService から呼び出されている FormulaTagService で発生します。このアプリケーションは、1 つのデータベースを使用して 2 つのサーバーで実行されています。1 台のサーバーでバッチ処理を実行するだけです。
私の質問は次のとおりです。a) 特定のトランザクション中にオブジェクトに変更が加えられていないドメイン オブジェクト インスタンスが生成される単純な select ステートメントが、最終的にセッション内で永続化され、古いオブジェクト例外が発生するのはなぜですか? b) Formula.tags で行われている並べ替えがトランザクションの最後に保持されている可能性はありますか? そのため、他の誰かが別のサーバーで式を変更している場合、staleobjectexception が発生しますか?
サービスを読み取り専用に変更しましたが、古いオブジェクトの例外が引き続き発生することに注意してください。どんな助けでも大歓迎です。
数式タグ サービス
FormulaBatchPopulatorService スニペット
hibernate - JPA と Hibernate で StaleObjectStateException を修正する方法
コントローラ ロジック:
サービスロジック
何が起こるのですか
90% の場合、これで問題なく動作します。
問題
関連する質問を読み、merge
上記の通話を見つけました。それはケースの約 50% を解決しましたが、すべてではありませんでした。