ошибка при слиянии с использованием hibernate 3 и ojdbc 7

Я получаю сообщение об ошибке, когда сохраняю свою сущность с помощью метода merge() из EntityManager. Эта проблема возникает, когда я использую Hibernate 3 в сочетании с ojdbc7 12.1.0.2.0 JDBC 4.1, но если я перейду на ojdbc6 11.2.0.3.0 JDBC 4.0, эта ошибка исчезнет. Может ли кто-нибудь помочь решить мою проблему, потому что мне нужно использовать ojdbc7.

>[2017-03-30 14:52:42.184]: ERROR - TransactionAspectSupport.completeTransactionAfterThrowing(408) | Application exception overridden by rollback exception
org.springframework.orm.jpa.JpaSystemException: org.hibernate.exception.GenericJDBCException: could not load an entity: [com.mycomp.casa.persistence.model.CustomerAccountOpening#554]; nested exception is javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not load an entity: [com.mycomp.casa.persistence.model.CustomerAccountOpening#554]
    at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:321)
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.translateExceptionIfPossible(AbstractEntityManagerFactoryBean.java:404)
    at org.springframework.dao.support.ChainedPersistenceExceptionTranslator.translateExceptionIfPossible(ChainedPersistenceExceptionTranslator.java:58)
    at org.springframework.dao.support.DataAccessUtils.translateIfNecessary(DataAccessUtils.java:213)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:163)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622)
    Caused by: javax.persistence.PersistenceException: org.hibernate.exception.GenericJDBCException: could not load an entity: [com.mycomp.casa.persistence.model.CustomerAccountOpening#554]
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1214)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1147)
    at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1153)
    at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:695)
    at sun.reflect.GeneratedMethodAccessor915.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:240)
    at com.sun.proxy.$Proxy104.merge(Unknown Source)

Caused by: org.hibernate.exception.GenericJDBCException: could not load an entity: [com.mycomp.casa.persistence.model.CustomerAccountOpening#554]
    at org.hibernate.exception.SQLStateConverter.handledNonSpecificException(SQLStateConverter.java:140)
    at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:128)
    at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
    at org.hibernate.loader.Loader.loadEntity(Loader.java:2041)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:86)
    at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:76)
    at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3293)
    at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:496)
    at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:477)
    at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:227)
    at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:285)
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:152)
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:1090)
    at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:1038)
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:630)
    at org.hibernate.type.EntityType.resolve(EntityType.java:438)
    at org.hibernate.type.EntityType.replace(EntityType.java:298)
    at org.hibernate.type.AbstractType.replace(AbstractType.java:176)
    at org.hibernate.type.TypeHelper.replace(TypeHelper.java:212)
    at org.hibernate.event.def.DefaultMergeEventListener.copyValues(DefaultMergeEventListener.java:600)
    at org.hibernate.event.def.DefaultMergeEventListener.mergeTransientEntity(DefaultMergeEventListener.java:337)
    at org.hibernate.event.def.DefaultMergeEventListener.entityIsTransient(DefaultMergeEventListener.java:303)
    at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:258)
    at org.hibernate.event.def.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:84)
    at org.hibernate.impl.SessionImpl.fireMerge(SessionImpl.java:867)
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:851)
    at org.hibernate.impl.SessionImpl.merge(SessionImpl.java:855)
    at org.hibernate.ejb.AbstractEntityManagerImpl.merge(AbstractEntityManagerImpl.java:686)
    ... 143 more
Caused by: java.sql.SQLException: Error
    at org.jboss.jca.adapters.jdbc.WrappedConnection.checkException(WrappedConnection.java:1972)
    at org.jboss.jca.adapters.jdbc.WrappedStatement.checkException(WrappedStatement.java:1446)
    at org.jboss.jca.adapters.jdbc.WrappedResultSet.checkException(WrappedResultSet.java:5986)
    at org.jboss.jca.adapters.jdbc.WrappedResultSet.next(WrappedResultSet.java:2693)
    at org.hibernate.loader.Loader.doQuery(Loader.java:825)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:274)
    at org.hibernate.loader.Loader.loadEntity(Loader.java:2037)
    ... 167 more
Caused by: java.lang.ArrayIndexOutOfBoundsException: 128
    at oracle.jdbc.driver.T4CTTIrxd.readBitVector(T4CTTIrxd.java:135)
    at oracle.jdbc.driver.T4C8TTIrxh.unmarshalV10(T4C8TTIrxh.java:123)
    at oracle.jdbc.driver.T4C8Oall.readRXH(T4C8Oall.java:678)
    at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:436)
    at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:257)
    at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:587)
    at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:225)
    at oracle.jdbc.driver.T4CPreparedStatement.fetch(T4CPreparedStatement.java:1066)
    at oracle.jdbc.driver.OracleStatement.fetchMoreRows(OracleStatement.java:3716)
    at oracle.jdbc.driver.InsensitiveScrollableResultSet.fetchMoreRows(InsensitiveScrollableResultSet.java:1015)
    at oracle.jdbc.driver.InsensitiveScrollableResultSet.absoluteInternal(InsensitiveScrollableResultSet.java:979)
    at oracle.jdbc.driver.InsensitiveScrollableResultSet.next(InsensitiveScrollableResultSet.java:579)
    at org.jboss.jca.adapters.jdbc.WrappedResultSet.next(WrappedResultSet.java:2689)
    ... 170 more

person user3767527    schedule 30.03.2017    source источник
comment
Какая у вас версия сервера базы данных Oracle?   -  person Mark Rotteveel    schedule 30.03.2017
comment
Также зачем вам нужно использовать ojdbc7?   -  person Mark Rotteveel    schedule 30.03.2017
comment
моя версия оракула 12 с   -  person user3767527    schedule 31.03.2017
comment
Потому что компания, которая покупает мои приложения, использует ojdbc7 в качестве стандартизации компании.   -  person user3767527    schedule 31.03.2017
comment
Есть еще один вопрос (выглядит как дубликат) с интересным ответом. Голосование за закрытие как дубликат.   -  person Xavi López    schedule 20.04.2017


Ответы (2)


Была такая же проблема с использованием драйвера 12.1.0.2 с базой данных Oracle 10g. По-видимому, это происходит, когда драйвер выполняет выборку - запрашивает базу данных для получения дополнительных строк при прокрутке ResultSet.

Похоже на неприятную ошибку в драйвере, как указал @MarkRotteveel в своем комментарий.

Увеличение свойства fetchSize хорошо сработало в качестве временного обходного пути, позволяющего избежать проблемы, заставляя драйвер извлекать все результаты сразу, не оставляя данных для выборки, но это не долгосрочное решение и может иметь большое негативное влияние на производительность. памяти в зависимости от размера и объема данных, извлекаемых запросом.

Если вы используете Hibernate, попробуйте определить запрос, вызывающий исключение (используйте, например, hibernate.show_sql), проверьте, сколько строк он возвращает, и настройте hibernate.jdbc.fetch_size соответственно.

Ненулевое значение определяет размер выборки JDBC (вызывает Statement.setFetchSize()).

Или попробуйте использовать другую версию драйвера. Это исключение не произошло с 12.1.0.1, если я правильно помню.

person Xavi López    schedule 11.04.2017
comment
Я пробовал, и одно и то же исключение возникает как на драйверах ojdbc6, так и на ojdbc7. - person Michał Stochmal; 12.06.2018
comment
@MichałStochmal Единственная разница между ojdbc6 и ojdbc7 должна заключаться в совместимости с JVM (скомпилирована с JDK6 или 7). Если это одна и та же версия драйвера, они должны вызывать одно и то же исключение. Попробуйте найти реальную версию драйвера, просмотрев META-INF/MANIFEST.MF внутри jar, загрузка более новой версии драйвера с oracle.com должна это исправить. - person Xavi López; 12.06.2018

Если вы используете Oracle 12c, попробуйте использовать Oracle12cDialect для диалекта.

person brijesh    schedule 30.03.2017
comment
который недоступен в спящем режиме 3 :) @ user3767527, вам придется обновить спящий режим или перенести диалект из спящего режима 5 в спящий режим 3, но похоже, что контракт Dialect сильно изменился между этими двумя основными версиями. - person Thierry; 30.03.2017
comment
Ошибка указывает на низкоуровневую ошибку в реализации протокола в драйвере JDBC Oracle: я был бы удивлен, если бы это было связано с диалектом Hibernate. - person Mark Rotteveel; 30.03.2017