Ошибка пакетного удаления HSQLDB, но в Oracle это работает

#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. Я перепишу запросы и протестирую их снова.