【问题标题】:ORA-12899: value too large for column, even if value in Exception is smallerORA-12899: 列的值太大,即使异常中的值更小
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 在事务结束时抛出异常,由 Spring-AOP 切入点控制。 DB-Queries 是由 EclipseLink 制作的,所以我只能猜测它们到底是什么。 BE类注解:@Entity@Table(name = "T_MONITORING")public class MonitoringBE {`@Column(name = "VERSION")``private String version;`
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2015-02-19
    • 1970-01-01
    • 2021-05-09
    • 2023-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-25
    • 1970-01-01
    相关资源
    最近更新 更多