【发布时间】:2013-10-23 10:59:39
【问题描述】:
我在通过 EclipseLink 更新数据库中的实体时遇到 ORA-12899 错误。异常内容如下:
RuntimeException 捕获:org.springframework.transaction.TransactionSystemException:无法提交 JPA 事务;嵌套异常是 javax.persistence.RollbackException: 异常 [EclipseLink-4002] (Eclipse Persistence Services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.DatabaseException 内部异常:java.sql.BatchUpdateException:ORA-12899:“T_MONITORING”列的值太大。“VERSION”(实际:295,最大值:255)
错误代码:12899 查询:UpdateObjectQuery(MonitoringBE@7e6dc6aeMonitoringBE {id: 17b50dcd-3184-4b47-998a-7c3a93a71695, 主机名: HOSTNAME, releaseTimestamp: 2013-10-17 12:04:01.578, javaSPVersion: 1.6.0_24, softwareVersion: 4.0.30。 -RC8, testId: 6e1bc90f_549a_46aa_91f2_e9ff8a96baef, 版本: PSDZ:4.8.1.0332013 - 20130522-1210;KIS AWL:5.0.0;KIS-WB:[S15A;0;0;32;2;10 月 7 日星期一 15:03 :55 CEST 2013;4556499;3;Ausleitung zu SAb;8;8], lastMrtAnswer: 2013-10-17 12:45:15.471, serverInstance: MyServer, lastModified: 2013-10-17 12:45: 24.088})
“VERSION”列定义为 VARCHAR2(255 CHAR)。在这种情况下,我的问题是异常中的字符串不超过 255 个字符。怎么可能?异常的输出是否错误?更新查询未执行。
BusinessEntity (MonitoringBE) 在普通 java 中使用 setter 方法进行操作。然后在实体管理器(javax.persistence.EntityManager)中调用合并:
getEntityManager().merge( entity )
我正在使用来自 Java 1.6.0.24 Glassfish 服务器的 Oracle 11g Enterprise (11.2.0.2.0) 和 EclipseLink 2.1.1。 Oracle中的字符集是AL32UTF8,应该可以存储所有类型的字符(4字节)。
谁能帮忙?
【问题讨论】:
-
是否有可能您打印了最后修改实体的值,但同一事务中的某些先前修改过长?
-
打开 eclipselink 参数日志以查看它对数据库的影响,请参阅wiki.eclipse.org/EclipseLink/Examples/JPA/Logging。还要检查如果使用方法访问,你的 getter 方法没有在字符串中附加一些东西
-
我也感觉到异常没有记录新值,但其他一些实体正在抛出错误。但这并不意味着我离找到原因更近了。该系统在生产环境中运行,因此无法更改该机器上的 Eclipse 日志记录。我会尝试在本地重现错误。
标签: java oracle eclipselink varchar2 ora-12899