java.lang.ClassCastException: com.sun.proxy.$Proxy45 несовместим с oracle.sql.CLOB

Нужна помощь специалистов. Версия Hibernate, которую мы используем: 3.6.0.Final. После сохранения гибернации Pojo в базе данных оракула и попытки зафиксировать транзакцию JTA возникает следующая ошибка:

Здесь есть несколько возможностей. Во-первых, обратите внимание, что com.sun.proxy.$Proxy45 — это динамический прокси-класс (см. java.lang.reflect.Proxy.getProxyClass/newProxyInstance). Hibernate вызывает один из API-интерфейсов JDBC java.sql.PreparedStatement.setClob(...), который принимает параметр java.sql.Clob, и в качестве этого параметра предоставляется экземпляр динамического прокси.


person Reddeiah Malepati    schedule 03.04.2017    source источник
comment
stackoverflow.com/questions/17200815/   -  person Pradeep    schedule 03.04.2017
comment
Привет, org.hibernate.engine.jdbc.ClobProxy@7acb38f3 это объект, полученный после сохранения в БД и перед фиксацией транзакции. Спасибо   -  person Pradeep    schedule 03.04.2017
comment
Спасибо за ваше хорошее объяснение. Мы решили эту проблему, создав объект сеанса Clob from Hibernate. Ранее мы пробовали это с помощью Hibernate.createClob(), что вызывало проблему.   -  person Reddeiah Malepati    schedule 03.04.2017


Ответы (1)


Следует отметить, что WebSphere Application Server не прокси-сервер java.sql.Clob, и кажется маловероятным (хотя и не совсем невозможным), что драйвер Oracle также будет это делать, поэтому я думаю, что Hibernate или, возможно, код, который вызывает Hibernate, построение прокси. Из исключения ясно, что драйвер JDBC Oracle ожидает, что он сможет преобразовать параметр (который по спецификации JDBC должен быть только java.sql.Clob) в oracle.sql.CLOB, который является специфичным для оракула подклассом java.sql. .Клоб. См. https://docs.oracle.com/database/121/JAJDB/oracle/sql/CLOB.html. Похоже, что Oracle также определяет специфичный для поставщика интерфейс специально для приема oracle.sql.CLOB https://docs.oracle.com/database/121/JAJDB/oracle/jdbc/OraclePreparedStatement.html#setCLOB_int__oracle_sql_CLOB_, поэтому кажется неправильным, что драйвер Oracle требует, чтобы Oracle специфический интерфейс oracle.sql.CLOB должен быть предоставлен стандартному методу JDBC java.sql.PreparedStatement.setClob(..., java.sql.Clob). В любом случае, как пользователь, вы мало что можете с этим поделать. Hibernate потенциально может обойти это, создав динамический прокси-сервер для oracle.sql.CLOB, а не для java.sql.Clob, если они еще этого не сделали, поскольку есть еще одна возможность, которая может вызвать эту ошибку. Если у вас есть несколько копий драйвера Oracle между вашим приложением, Hibernate и поставщиком JDBC, определенным на сервере приложений, могут быть две копии класса oracle.sql.CLOB, поступающие из разных загрузчиков классов, так что эти два экземпляра oracle.sql.CLOB несовместимы друг с другом и не смогут выполнить приведение типов. Чтобы проверить, не является ли это причиной, просмотрите свои приложения и конфигурацию провайдера JDBC сервера приложений, общие библиотеки и другие места, где у вас может быть несколько копий драйвера JDBC Oracle (обычно с именем ojdbc*.jar). Если вы найдете несколько, переключитесь на использование только одного и в одном месте. В противном случае проблема, вероятно, находится вне вашего контроля.

Привет. Не могли бы вы отладить и посмотреть, какой объект вы получаете. Если вы получаете java.sql.Clob, вам нужно преобразовать вашу ссылку в java.sql.Clob вместо oracle.sql.CLOB

person njr    schedule 03.04.2017
comment
Неправильно ==== Hibernate.createClob(сообщение); Правильно ==== HibernateSessionUtil.getSessionFactory().getCurrentSession().getLobHelper().createClob(сообщение) - person Reddeiah Malepati; 04.04.2017
comment
Исключение, полученное из операции синхронизации before_completion: java.lang.ClassCastException: com.sun.proxy.$Proxy45 несовместим с oracle.sql.CLOB в oracle.jdbc.driver.OraclePreparedStatement.setClob(OraclePreparedStatement.java:6236) в oracle.jdbc. driver.OraclePreparedStatementWrapper.setClob(OraclePreparedStatementWrapper.java:158) в com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.setClob(WSJdbcPreparedStatement.java:1845) в org.hibernate.type.descriptor.sql.ClobTypeDescriptor$1.doDeBind(Clob .java:60) в org.hibernate.type.descriptor.sql.BasicBinder.bind(BasicBinder.java:89) в org.hibernate.type.AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:282) в org.hibernate.type. AbstractStandardBasicType.nullSafeSet(AbstractStandardBasicType.java:277) в org.hibernate.type.AbstractSingleColumnStandardBasicType.nullSafeSet(AbstractSingleColumnStandardBasicType.java:85) в org.hibernate.persist er.entity.AbstractEntityPersister.dehydrate(AbstractEntityPersister.java:2166) в org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:2412) в org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java: 2856) в org.hibernate.action.EntityInsertAction.execute(EntityInsertAction.java:79) в org.hibernate.engine.ActionQueue.execute(ActionQueue.java:273) в org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java :265) в org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:184) в org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321) в org.hibernate.event.def.DefaultFlushEventListener. onFlush(DefaultFlushEventListener.java:51) в org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1216) в org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:383) в org.hibernate.transaction.s ynchronization.CallbackCoordinator.beforeCompletion(CallbackCoordinator.java:117) в org.hibernate.transaction.synchronization.HibernateSynchronizationImpl.beforeCompletion(HibernateSynchronizationImpl.java:51) в com.ibm.tx.jta.impl.RegisteredSyncs.coreDistributeBefore(RegisteredSyncs.java: 291) на com.ibm.ws.tx.jta.RegisteredSyncs.distributeBefore(RegisteredSyncs.java:153) на com.ibm.ws.tx.jta.TransactionImpl.prePrepare(TransactionImpl.java:2369) на com.ibm.ws .tx.jta. TransactionImpl.stage1CommitProcessing(TransactionImpl.java:577) в com.ibm.tx.jta.impl.TransactionImpl.processCommit(TransactionImpl.java:1015) в com.ibm.tx.jta.impl.TransactionImpl.commit(TransactionImpl.java: 949) в com.ibm.ws.tx.jta.TranManagerImpl.commit(TranManagerImpl.java:439) в com.ibm.tx.jta.impl.TranManagerSet.commit(TranManagerSet.java:191) в com.ibm.ws .tx.jta.UserTransactionImpl.commit(UserTransactionImpl.java:302) на com.scania.webstars.scheduling.job.sla.SchedulingJobImportDataFromPAMPA.executeImportTask(SchedulingJobImportDataFromPAMPA.java:151) на com.scania.webstars.scheduling.job.sla .SchedulingJobImportDataFromPAMPA.timerExpired(SchedulingJobImportDataFromPAMPA.java:76) в com.ibm.ws.asynchbeans.timer.TimerImpl.callListenerMethod(TimerImpl.java:361) в com.ibm.ws.asynchbeans.timer.GenericTimer.run(GenericTimer.java) :228) в com.ibm.ws.asynchbeans.J2EEContext$RunProxy.run(J2EEContext.java:265) в java.sec urity.AccessController.doPrivileged(AccessController.java:252) в javax.security.auth.Subject.doAs(Subject.java:495) в com.ibm.websphere.security.auth.WSSubject.doAs(WSSubject.java:132) в com.ibm.websphere.security.auth.WSSubject.doAs(WSSubject.java:90) в com.ibm.ws.asynchbeans.J2EEContext$DoAsProxy.run(J2EEContext.java:336) в java.security.AccessController.doPrivileged (AccessController.java:280) по адресу com.ibm.ws.asynchbeans.J2EEContext.run(J2EEContext.java:1174) по адресу com.ibm.ws.asynchbeans.timer.TimerImpl.runListenerAsCJWork(TimerImpl.java:490) по адресу com. ibm.ws.asynchbeans.am._Alarm.fireAlarm(_Alarm.java:333) в com.ibm.ws.asynchbeans.am._Alarm.run(_Alarm.java:230) в com.ibm.ws.util.ThreadPool$ Worker.run(ThreadPool.java:1862) - person Reddeiah Malepati; 04.04.2017