1

通过 EclipseLink 更新数据库中的实体时出现 ORA-12899 错误。例外情况如下:

RuntimeException 捕获:org.springframework.transaction.TransactionSystemException:无法提交 JPA 事务;嵌套异常是 javax.persistence.RollbackException: Exception [EclipseLink-4002] (Eclipse Persistence Services - 2.1.1.v20100817-r8050): org.eclipse.persistence.exceptions.DatabaseException 内部异常: java.sql.BatchUpdateException: ORA-12899 :对于列“T_MONITORING”的值太大。“版本”(实际:295,最大值:255

错误代码:12899 查询:UpdateObjectQuery(MonitoringBE@7e6dc6aeMonitoringBE {id:17b50dcd-3184-4b47-998a-7c3a93a71695,主机名:HOSTNAME,releaseTimestamp:2013-10-17 12:04:01.578,javaVersion:1.6.0_24,软件版本:4.0.0_24 .30.SP401-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 字节)。

任何人都可以帮忙吗?

4

2 回答 2

0

我可以使用更新的 Eclipselink 2.5.1 版重现该行为。那里的异常说明了属性的正确参数值。也许 EclipseLink 2.1.1 在这里有不同的行为。在实体中设置之前截断字符串可以解决问题。

于 2013-10-25T05:25:39.337 回答
0

如错误“实际:295”中所述

这意味着数据库层为该列获取 295 个字符,请确保查询语法和双引号、逗号等在正确的位置

于 2013-10-23T11:05:44.957 回答