#sql #oracle #hibernate #hsqldb
#sql #Oracle #переход в спящий режим #hsqldb
Вопрос:
У меня есть настройка с помощью: Spring Hibernate JPA Junit для тестирования моего кода.
У меня есть Oracle в качестве базы данных. Когда я тестирую свой код, каждый тест пройден. Этот код даже находится в рабочей среде.Я хотел использовать HSQLDB в памяти для junit вместо Oracle.Большинство тестов все еще прошли с HSQLDB, но один конкретный тест всегда завершается неудачей с HQSQLDB. (В Oracle работает нормально).
вот строка, которая вызывает проблемы. (Я использовал log4jdbc для вывода инструкций sql).
создание пакета для двух инструкций:
1: удалить из IMAGE_TAGS, где IMAGE_TAGS_KEY= 1
2: удалить из IMAGE_TAGS, где IMAGE_TAGS_KEY= 2
в JPA я ищу объект для их удаления. На первой итерации работает нормально, но когда я перехожу ко второму элементу, происходит сбой с этим исключением :
org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:85)
at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:70)
at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:90)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:70)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:268)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:114)
at org.hibernate.jdbc.AbstractBatcher.prepareStatement(AbstractBatcher.java:109)
at org.hibernate.jdbc.AbstractBatcher.prepareBatchStatement(AbstractBatcher.java:244)
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2666)
at org.hibernate.persister.entity.AbstractEntityPersister.delete(AbstractEntityPersister.java:2911)
at org.hibernate.action.EntityDeleteAction.execute(EntityDeleteAction.java:97)
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:189)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:321)
at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:64)
at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:1185)
at org.hibernate.impl.SessionImpl.executeUpdate(SessionImpl.java:1283)
at org.hibernate.impl.QueryImpl.executeUpdate(QueryImpl.java:117)
at com.videotron.imagemanager.dao.ImageContentGroupDAOImpl.removeImageContentGroup(ImageContentGroupDAOImpl.java:143)
at com.videotron.imagemanager.dao.ImageContentGroupDAOImpl$$FastClassByCGLIB$$8ef3e206.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:627)
at com.videotron.imagemanager.dao.ImageContentGroupDAOImpl$$EnhancerByCGLIB$$a153b522.removeImageContentGroup(<generated>)
at com.videotron.imagemanager.service.ImageManagerServiceImpl.cleanContent(ImageManagerServiceImpl.java:270)
at com.videotron.imagemanager.service.ImageManagerServiceImpl$$FastClassByCGLIB$$82a03251.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:627)
at com.videotron.imagemanager.service.ImageManagerServiceImpl$$EnhancerByCGLIB$$1a5a3f0d.cleanContent(<generated>)
at com.videotron.imagemanager.image.impl.v1.ImageManagerImpl.cleanContent(ImageManagerImpl.java:1454)
at com.videotron.imagemanager.image.impl.v1.ImageManagerImpl$$FastClassByCGLIB$$4ded3863.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:698)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:260)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
at com.videotron.imagemanager.image.impl.v1.ImageManagerImpl$$EnhancerByCGLIB$$c6ce4df.cleanContent(<generated>)
at com.videotron.imagemanager.service.ImageManagerServiceFacade.cleanContent(ImageManagerServiceFacade.java:350)
at com.videotron.imagemanager.service.ImageManagerServiceFacade$$FastClassByCGLIB$$558f388b.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:627)
at com.videotron.imagemanager.service.ImageManagerServiceFacade$$EnhancerByCGLIB$$fb734807.cleanContent(<generated>)
at com.videotron.imagemanager.service.ImageManagerServiceFacadeTest.testCleanContent(ImageManagerServiceFacadeTest.java:671)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:88)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Ответ №1:
Причина исключения org.hibernate.StaleStateException
в основном из-за
«Спящий режим кэширует объекты из сеанса. Если объект был изменен, и Hibernate не знает об этом, он выдаст это исключение «.
Или
Удаление данных перед фиксацией объекта может привести к удалению всех объектов, ожидающих сохранения.
Я предложу установить уровень журнала spring и log4jdbc на debug
и включить show_sql
режим гибернации, это даст вам четкое представление.
Обновить
На первый взгляд, я думаю, что:
На первой итерации, когда вы говорите Delete IMAGE_TAGS_KEY
1 и 2, hibernate запускает этот запрос, так что вы получаете этот запрос, регистрируемый log4jdbc, но транзакция все еще не совершена, поэтому изменения все еще не записаны в DB, и на второй итерации вы снова удаляете те же ключи, которые ожидают отражения.
Комментарии:
1. это поведение, которое, как я думал, произошло. Просто не уверен, почему это нормально работает в Oracle, но не с HSQLDB. Я перепишу запросы и протестирую их снова.