1

首先,让我简要解释一下我的应用程序是如何工作的:

该应用程序处理交易,这些交易以 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

4

1 回答 1

5

会不会是本地化?例如,在您的系统上,您使用“1,5”而不是“1.5”填充 xml。Hibernate 报告的错误清楚地指向了那个方向。您可以禁用触发器并查看生成的 xmltype 在该表中的内容。如果您或您的一位同事可以通过类似客户端的 SQL Developer 访问数据库,您可以尝试“手动”运行触发器中的代码。

当您遇到 ORA-01722 时,请参阅此处了解信息和可能采取的措施。

于 2011-06-28T13:36:22.160 回答