ORA-12899: значение слишком велико для столбца, даже если значение в Exception меньше

Я получаю сообщение об ошибке ORA-12899 при обновлении сущностей в БД через EclipseLink. Исключение звучит следующим образом:

Обнаружено исключение 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, версия java: 1.6.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;Пн окт. 07 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})

Столбец «ВЕРСИЯ» определяется как VARCHAR2 (255 CHAR). Моя проблема в этом случае заключается в том, что длина строки в исключении не превышает 255 символов. Как это может быть? Является ли вывод исключения неверным? Запрос на обновление не выполняется.

BusinessEntity (MonitoringBE) управляется в простой Java с использованием методов установки. Затем в диспетчере сущностей (javax.persistence.EntityManager) вызывается слияние:

getEntityManager().merge( entity )

Я использую Oracle 11g Enterprise (11.2.0.2.0) с EclipseLink 2.1.1 с Java 1.6.0.24 Glassfish Server. Набор символов в Oracle — AL32UTF8, который должен хранить все типы символов (4 байта).

Кто-нибудь может помочь?


person czo02    schedule 23.10.2013    source источник
comment
Возможно ли, что вы печатаете значение для последнего измененного объекта, но какое-то предыдущее изменение в той же транзакции слишком длинное?   -  person Klas Lindbäck    schedule 23.10.2013
comment
Включите ведение журнала параметров eclipselink, чтобы увидеть, что он отправляет в базу данных, см. wiki.eclipse.org /EclipseLink/Примеры/JPA/Ведение журнала. Также убедитесь, что при использовании доступа к методу ваш метод получения не добавляет что-либо к строке.   -  person Chris    schedule 23.10.2013
comment
У меня также возникает ощущение, что исключение не регистрирует новые значения, но какой-то другой объект выдает ошибку. Но это не значит, что я ближе к поиску причины. Система работает в производственной среде, поэтому изменение журнала eclipse на этом компьютере невозможно. Попробую воспроизвести ошибку локально.   -  person czo02    schedule 24.10.2013


Ответы (2)


как указано в ошибке "фактическое: 295"

Что означает, что уровень базы данных получает 295 символов для столбца, пожалуйста, убедитесь, что синтаксис запроса и двойные кавычки, запятая и т. д. в правильном месте

person Fahad    schedule 23.10.2013
comment
Исключение возникает в конце транзакции, которая контролируется Spring-AOP Pointcut. DB-запросы сделаны EclipseLink, поэтому я могу только догадываться, что они на самом деле. Класс BE аннотирован: @Entity @Table(name = "T_MONITORING") public class MonitoringBE { `@Column(name = VERSION)` `private String version;` - person czo02; 24.10.2013

Я мог бы воспроизвести поведение с более новой версией Eclipselink 2.5.1. Исключение указывает правильное значение параметра для атрибута. Возможно, EclipseLink 2.1.1 ведет себя по-другому. Усечение строки перед ее установкой в ​​Entity решает проблему.

person czo02    schedule 25.10.2013