首先,让我简要解释一下我的应用程序是如何工作的:
应用程序处理交易,这些交易作为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)。 然后,我执行了相同的测试,但触发器仍然失败。
到目前为止,我已经消除了以下嫌疑人:
我想知道的是,如果我的Windows XP环境有一些特定的编码配置,它会“转换”XML中的某些数据并制作它们
我的问题
我知道我没有提供很多信息,但如果你能给我一些提示或想法,我将非常感激!
问候。
技术信息: Java 1.6,Oracle 11g,Tomcat 5.5.23,JSF 1.2,Hibernate 3.3
答案 0 :(得分:5)
可能是本地化吗?在您的系统上,您将使用“1,5”而不是“1.5”填充xml。 Hibernate报告的错误明确指向了这个方向。您可以禁用触发器并查看该表中生成的xmltype的内容。如果您或您的某个同事可以通过SQL Developer(如客户端)访问数据库,您可以尝试在“触发器”中“手动”运行代码。
有关您遇到ORA-01722时的信息和可能的操作,请参阅here。