gpt4 book ai didi

java.lang.ClassCastException : com. sun.proxy.$Proxy45 与 oracle.sql.CLOB 不兼容

转载 作者:行者123 更新时间:2023-11-30 10:31:30 26 4
gpt4 key购买 nike

需要专家的帮助。我们使用的 Hibernate 版本:3.6.0.Final。在将 hibernate Pojo 保存在 oracle DB 中并尝试在 JTA 事务下提交后,出现以下错误:

Exception caught from before_completion synchronization operation: java.lang.ClassCastException: com.sun.proxy.$Proxy45 incompatible with oracle.sql.CLOB at oracle.jdbc.driver.OraclePreparedStatement.setClob(OraclePreparedStatement.java:6236) at oracle.jdbc.driver.OraclePreparedStatementWrapper.setClob(OraclePreparedStatementWrapper.java:158) at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.setClob(WSJdbcPreparedStatement.java:1845) at org.hibernate.type.descriptor.sql.ClobTypeDescriptor$1.doBind(ClobTypeDescriptor.java:60) at org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:89) at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:282) at org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:277) at org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:85) at org.hibernate.persister.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2166) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2412) at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2856) at org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79) at org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:265) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:51) at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383) at org.hibernate.transaction.synchronization.CallbackCoordinator.beforeCompletion(CallbackCoordinator.java:117) at org.hibernate.transaction.synchronization.HibernateSynchronizationImpl.beforeCompletion(HibernateSynchronizationImpl.java:51) at com.ibm.tx.jta.impl.RegisteredSyncs.coreDistributeBefore(RegisteredSyncs.java:291) at com.ibm.ws.tx.jta.RegisteredSyncs.distributeBefore(RegisteredSyncs.java:153) at com.ibm.ws.tx.jta.TransactionImpl.prePrepare(TransactionImpl.java:2369) at com.ibm.ws.tx.jta.TransactionImpl.stage1CommitProcessing(TransactionImpl.java:577) at com.ibm.tx.jta.impl.TransactionImpl.processCommit(TransactionImpl.java:1015) at com.ibm.tx.jta.impl.TransactionImpl.commit(TransactionImpl.java:949) at com.ibm.ws.tx.jta.TranManagerImpl.commit(TranManagerImpl.java:439) at com.ibm.tx.jta.impl.TranManagerSet.commit(TranManagerSet.java:191) at com.ibm.ws.tx.jta.UserTransactionImpl.commit(UserTransactionImpl.java:302) at com.scania.webstars.scheduling.job.sla.SchedulingJobImportDataFromPAMPA.executeImportTask(SchedulingJobImportDataFromPAMPA.java:151) at com.scania.webstars.scheduling.job.sla.SchedulingJobImportDataFromPAMPA.timerExpired(SchedulingJobImportDataFromPAMPA.java:76) at com.ibm.ws.asynchbeans.timer.TimerImpl.callListenerMethod(TimerImpl.java:361) at com.ibm.ws.asynchbeans.timer.GenericTimer.run(GenericTimer.java:228) at com.ibm.ws.asynchbeans.J2EEContext$RunProxy.run(J2EEContext.java:265) at java.security.AccessController.doPrivileged(AccessController.java:252) at javax.security.auth.Subject.doAs(Subject.java:495) at com.ibm.websphere.security.auth.WSSubject.doAs(WSSubject.java:132) at com.ibm.websphere.security.auth.WSSubject.doAs(WSSubject.java:90) at com.ibm.ws.asynchbeans.J2EEContext$DoAsProxy.run(J2EEContext.java:336) at java.security.AccessController.doPrivileged(AccessController.java:280) at com.ibm.ws.asynchbeans.J2EEContext.run(J2EEContext.java:1174) at com.ibm.ws.asynchbeans.timer.TimerImpl.runListenerAsCJWork(TimerImpl.java:490) at com.ibm.ws.asynchbeans.am._Alarm.fireAlarm(_Alarm.java:333) at com.ibm.ws.asynchbeans.am._Alarm.run(_Alarm.java:230) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1862)

最佳答案

这里有两种可能性。首先,请注意 com.sun.proxy.$Proxy45 是一个动态代理类(请参阅 java.lang.reflect.Proxy.getProxyClass/newProxyInstance)。Hibernate 正在调用 JDBC API java.sql.PreparedStatement.setClob(...) 之一,它接受 java.sql.Clob 参数,并提供一个动态代理实例作为该参数。

应该注意的是,WebSphere Application Server 不代理 java.sql.Clob,而且 Oracle 驱动程序似乎也不太可能(尽管并非完全不可能)这样做,所以我最好的猜测是 Hibernate 或可能的代码调用 Hibernate 正在构建代理。从异常中可以清楚地看出,Oracle JDBC 驱动程序希望能够将参数(JDBC 规范只需要是 java.sql.Clob)转换为 oracle.sql.CLOB,它是 java.sql 的特定于 oracle 的子类.Clob。参见 https://docs.oracle.com/database/121/JAJDB/oracle/sql/CLOB.html .看起来 Oracle 还定义了一个专门用于接受 oracle.sql.CLOB 的供应商特定接口(interface) https://docs.oracle.com/database/121/JAJDB/oracle/jdbc/OraclePreparedStatement.html#setCLOB_int__oracle_sql_CLOB_因此,Oracle 驱动程序要求将特定于 Oracle 的 oracle.sql.CLOB 接口(interface)提供给 JDBC 标准 java.sql.PreparedStatement.setClob(..., java.sql.Clob) 方法显然是错误的。无论如何,作为用户,您对此无能为力。 Hibernate 可以通过为 oracle.sql.CLOB 而不是 java.sql.Clob 构建动态代理来解决这个问题——如果他们还没有这样做的话,因为还有另一种可能导致这个错误。如果您的应用程序、Hibernate 和应用程序服务器中定义的 JDBC 提供程序之间有多个 Oracle 驱动程序副本,则可能有来自不同类加载器的 oracle.sql.CLOB 类的两个副本,这样这两个实例oracle.sql.CLOB 类彼此不兼容,无法转换。要检查这是否可能是原因,请查看您的应用程序和应用程序服务器 JDBC 提供程序配置、共享库以及您可能拥有 Oracle JDBC 驱动程序(通常名为 ojdbc*.jar)的多个副本的任何其他地方。如果你发现多个,切换到只使用一个,并且在一个地方。否则,问题可能超出您的控制范围。

关于java.lang.ClassCastException : com. sun.proxy.$Proxy45 与 oracle.sql.CLOB 不兼容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43184062/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com