首先,让我简要解释一下我的应用程序是如何工作的:
该应用程序处理交易,这些交易以 XML 文档的形式存储在我们的数据库 (Oracle 11g) 中。包含这些信息的表定义如下:
table T_MYDEALS (
DEAL_ID number(9, 0) not null,
DEAL_XML xmltype
)
当我们在这个表中更新或插入新项目时,我们有一个触发器,它将读取(使用 XPath)这个 XML,并填充其他一些元数据表。
一切正常,除了在我的机器上。
现在的问题
当我在我的机器上运行应用程序时(即 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 行位于触发代码的末尾。
我的测试
所以我试图理解为什么这个错误发生在我的机器上(因为它只发生在我的机器上,我的同事都没有遇到这个问题)。我不能说它什么时候开始停止工作,也许是我最近换了电脑?
首先,我检查了源代码,然后是我的数据库连接,但一切似乎都是正确的。我还切换到调试模式以查看发送到数据库的 XML,或者至少查看我们的HibernateXMLType
(它是 的扩展org.hibernate.usertype.UserType
,用于将我们的 XML 转换为 Oracle 可读的数据)。但这里也没有发现任何错误。
我为您节省了许多在我这边完成的测试,但我最新的测试之一是获得一个新的 Tomcat 服务器,并部署一个部署在环境中的 WAR(例如 Homologation)。然后,我执行了相同的测试,但触发器仍然失败。
到目前为止,我已经排除了以下嫌疑人:
- 源代码,因为我还从部署在环境中且工作正常的 WAR 中测试了应用程序;
- 数据库本身,因为我连接到与工作环境相同的数据库。我也尝试了另一个数据库,结果是一样的。
- 用于我的测试的数据,因为如果我尝试保存相同的交易,但使用 Homologation 环境,它会起作用。
- 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