手動変更後のデータベースレコードの復帰
-
03-07-2019 - |
質問
問題は解決しました:どうもありがとう。以下の回答をご覧ください。
Hibernate3を使用してMySQL 5.5データベースに接続されたTomcat 5.5で実行されているWebサイトがあります。
1つのレコードは、実行された変更の保持を拒否します。プログラムでレコードを変更すると、値は以前の状態に戻ります。
データベース内のレコードを手動で変更すると、値は元に戻ります(Webアプリケーションがそれらにアクセスすると、どうやら)。
Tomcatを停止し、値を手動で変更してから、Tomcatを再起動しようとしました。データベースを確認すると、Tomcatがwebappを開始した後も値は変更されたままですが、サイトをロードすると元に戻ります。
また、webappのTomcat作業フォルダーと.serキャッシュファイルを削除しようとしました。
また、元に戻される値のコードをチェックしましたが、それらを見つけることができません。
この特定のレコードでのみ気づいた。
編集: hibernate.show_sql = trueを使用して、HibernateからのSQL出力を確認しました。私の行が入っているテーブルの更新クエリが記録されています。誰でも解決方法を知っていますか?列を実際の値にするには?
解決
mysqlクエリロギングを一時的に有効にして、値が変更されたsqlステートメントを正確に確認できます。サーバーの起動直後に変更すると言うので、文を非常に迅速に把握できるはずです。
他のヒント
ハロウィンに近づいてきているので、この種のことを期待する必要があります(さらには満月でした)が、Webアプリケーションの犯人を探し続けます...そこにいる必要があります。 webappソースコードですぐに検索するいくつかの値:
- 変更されるレコードのID。
- 書き込まれている値 レコード。
幸運...これらは見つけるのが本当のクマです!
これは、起動時にテストケースが発火するような匂いがし、テスト前に行を予想通りに変更します。
更新前にトリガーを追加し、行IDをチェックし、マジック行と一致する場合はSQLエラーを発生させます。 次に、生成されたスタックトレースを確認し、コードを調べて、行を更新する部分を見つけます。
助けてくれたみんなに感謝します。すべての提案は、追跡に役立ちました。
何が原因であるかを見つけることができました。悪いデータベース設計、複数のデータモデル、およびHibernateは、いくつかの厄介な問題を引き起こします。別のテーブルには値が保存されており、そのクラスは同じ値で基本クラスを拡張していました。
いくつかの正規化を行う時間です。