まず、私のアプリケーションがどのように機能するかを簡単に説明しましょう。
アプリケーションは、データベース (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