2013-10-23 64 views
1

當通過EclipseLink更新數據庫中的實體時,我收到ORA-12899錯誤。異常內容如下:ORA-12899:列值過大,即使Exception中的值較小

RuntimeException被捕獲:org.springframework.transaction.TransactionSystemException:無法提交JPA事務;嵌套異常是javax.persistence.RollbackException: 異常[EclipseLink-4002](Eclipse持久性服務 - 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,javaVersion:1.6.0_24,softwareVersion:4.0.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; Mon Oct 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})

「VERSION」列已定義作爲VARCHAR2(255 CHAR)。在這種情況下,我的問題是異常中的字符串不超過255個字符。怎麼可能?異常的輸出是否錯誤?更新查詢未執行。

BusinessEntity(MonitoringBE)使用setter-methods在plaind java中進行操作。然後合併是所謂的實體管理器(javax.persistence.EntityManager):我使用的是Oracle 11g企業(11.2.0.2.0)用的EclipseLink 2.1.1從Java 1.6.0.24 Glassfish的

getEntityManager().merge(entity) 

服務器。 Oracle中的字符集是AL32UTF8,它應該能夠存儲所有類型的字符(4字節)。

任何人都可以幫忙嗎?

爲錯誤提到
+0

是否有可能打印上次修改實體的值,但是同一事務中的某些先前修改時間太長? –

+0

打開eclipselink參數日誌記錄以查看它發佈給數據庫的情況,請參閱http://wiki.eclipse.org/EclipseLink/Examples/JPA/Logging。另外檢查一下,如果使用方法訪問,你的getter方法不會在字符串中追加某些東西 – Chris

+0

我也感覺到這個異常不會記錄新的值,但是其他實體會拋出錯誤。但這並不意味着我更接近尋找原因。 系統正在生產環境中運行,因此無法更改該機器上的eclipse日誌記錄。我將嘗試在本地重現錯誤。 – zerus

回答

0

我可以重現與更新的Eclipselink版本2.5.1的行爲。該例外說明了該屬性的正確參數值。也許EclipseLink 2.1.1在這裏有不同的行爲。 在設置實體之前截斷字符串可以解決問題。

0

「實際:295」

這意味着數據庫層獲得295字符列,請確保在正確的地方,查詢語法和雙引號,頓號等

+0

異常在由Spring-AOP切入點控制的事務結束時拋出。 DB-Queries是由EclipseLink製作的,所以我只能猜測它們是什麼。該BE類註釋: '@ Entity' '@Table(name = 「T_MONITORING」)'' 公共類MonitoringBE {'' @Column(name = 「版本」)'' 私人字符串版本;' – zerus

相關問題