1

まず、私のアプリケーションがどのように機能するかを簡単に説明しましょう。

アプリケーションは、データベース (Oracle 11g) に XML ドキュメントとして保存されている取引を処理します。これらの情報を含むテーブルは、次のように定義されます。

table T_MYDEALS (
    DEAL_ID number(9, 0) not null,
    DEAL_XML xmltype
)

このテーブルで新しいアイテムを更新または挿入すると、この XML を (XPath を使用して) 読み取り、他のいくつかのメタデータ テーブルに入力するトリガーがあります。

私のマシンを除いて、すべて正常に動作します。

今問題

自分のマシンでアプリケーションを実行すると (つまり、Tomcat は Eclipse 内で実行されますが、Homologation DB に接続されています)、トリガーは次のエラーで失敗します。

WARN  [org.hibernate.util.JDBCExceptionReporter] SQL Error: 1722, SQLState: 42000
ERROR [org.hibernate.util.JDBCExceptionReporter] ORA-01722: invalid number
ORA-06512: at "MY_SCHEMA.AFTER_R_INSERT_MYDEAL", line 628
ORA-04088: error during execution of trigger 'MY_SCHEMA.AFTER_R_INSERT_MYDEAL'

申し訳ありませんが、セキュリティ上の理由から、トリガーをここに置くことはできません。行 628 がトリガー コードの末尾にあることに注意してください。

私のテスト

そこで、このエラーが自分のマシンで発生した理由を理解しようとしました (これは自分のマシンでのみ発生するため、同僚の誰もこの問題に遭遇していません)。最近コンピューターを変えたときでしょうか?

最初にソース コードを確認し、次に DB 接続を確認しましたが、すべて正しいようです。また、デバッグモードに切り替えて、DBに送信されたXML、または少なくとも私たちHibernateXMLType(XMLの拡張でありorg.hibernate.usertype.UserType、XMLをOracleで読み取り可能なデータに変換するために使用されます)を調べました。しかし、ここでも何も問題はありませんでした。

私の側で行われた多くのテストを保存しますが、私の最新のテストの 1 つは、新しい Tomcat サーバーを取得し、環境にデプロイされた WAR をデプロイすることでした (たとえば、ホモロゲーション)。次に、同じテストを実行しましたが、トリガーはまだ失敗しています。

これまでのところ、次の容疑者を排除しました。

  • 環境にデプロイされ、正しく動作している WAR からアプリケーションもテストしたため、ソースコード。
  • 作業環境と同じDBに接続しているため、DB自体。別のDBでも試しましたが、結果は同じです。
  • 同じ取引を保存しようとすると機能するため、テストに使用されたデータですが、ホモロゲーション環境を使用しています。
  • JDK、JDK も新しいものに変更したため。
  • Eclipse、私の最新のテストは Eclipse の外で行われたため。
  • 新しいTomcatでも試したので、Tomcatサーバー。

私が疑問に思っているのは、私の Windows XP 環境に、XML 内の一部のデータを「変換」してそれらを作成する特定のエンコード構成があるかどうかです。

私の質問

  • テストで忘れた可能性のある要素は何ですか?
  • Oracleトリガーによって処理されたXMLを正確に知る方法はありますか(可能であれば、Oracleインスタンスに何もインストールせずに、制御できないため)?

私は多くの情報を提供していないことを知っていますが、ヒントやアイデアを教えていただければ、本当に感謝しています!

よろしく。


技術情報: Java 1.6、Oracle 11g、Tomcat 5.5.23、JSF 1.2、Hibernate 3.3

4

1 に答える 1

5

それはローカリゼーションでしょうか?たとえば、システムでは、xml に "1.5" ではなく "1,5" を入力しています。Hibernate によって報告されるエラーは、明らかにその方向を示しています。トリガーを無効にして、結果の xmltype がそのテーブルにあることを確認できます。また、あなたまたは同僚の 1 人が SQL Developer のようなクライアントを介してデータベースにアクセスできる場合は、トリガー内のコードを「手動で」試して実行することができます。

ORA-01722 が発生した場合の情報と可能なアクションについては、こちらを参照してください。

于 2011-06-28T13:36:22.160 に答える