|
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
|
|||
---|---|---|---|
#18+
Вылетает на вызове save. Код: java 1. 2. 3. 4. 5. 6.
Нагуглил два возможных решения этой проблемы: даунгрейдить версию хибернета ниже 5.2 или отказаться от использования SessionFactory и работать с JPA через EntityManager. Думаю, меня больше устроил бы первый вариант. Но что нужно написать в pom.xml. Сейчас там нет никакого явного указания версии Hibernate. C EntityManager я получаю такую же ошибку на вызове flush. Конфигурация sessiomFactory, датасорса и transactionManager: Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51.
pom.xml Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63.
Нагуглил два возможных решения этой проблемы: даунгрейдить версию хибернета ниже 5.2 или отказаться от использования SessionFactory и работать с JPA через EntityManager. Думаю, меня больше устроил бы первый вариант. Но что нужно написать в pom.xml. Сейчас там нет никакого явного указания версии Hibernate. C EntityManager я получаю такую же ошибку на вызове flush. Полный стек-трейс. java.lang.ClassCastException: org.springframework.orm.jpa.EntityManagerHolder cannot be cast to org.springframework.orm.hibernate5.SessionHolder at org.springframework.orm.hibernate5.HibernateTransactionManager.doGetTransaction(HibernateTransactionManager.java:399) ~[spring-orm-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:342) ~[spring-tx-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:474) ~[spring-tx-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:289) ~[spring-tx-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) ~[spring-tx-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:185) ~[spring-aop-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689) ~[spring-aop-5.0.4.RELEASE.jar:5.0.4.RELEASE] at com.fields.dao.FieldsApiDAO$$EnhancerBySpringCGLIB$$fd2c38ce.addField(<generated>) ~[classes/:na] at com.fields.controller.FieldsApiController.addField(FieldsApiController.java:38) ~[classes/:na] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_161] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_161] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_161] at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_161] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:870) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:776) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.web.servlet.FrameworkServlet.doPut(FrameworkServlet.java:892) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:664) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855) ~[spring-webmvc-5.0.4.RELEASE.jar:5.0.4.RELEASE] at javax.servlet.http.HttpServlet.service(HttpServlet.java:742) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) ~[tomcat-embed-websocket-8.5.28.jar:8.5.28] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.springframework.web.filter.HttpPutFormContentFilter.doFilterInternal(HttpPutFormContentFilter.java:109) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:81) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) ~[spring-web-5.0.4.RELEASE.jar:5.0.4.RELEASE] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199) ~[tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) [tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:496) [tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140) [tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81) [tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87) [tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) [tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:803) [tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:790) [tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1459) [tomcat-embed-core-8.5.28.jar:8.5.28] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.28.jar:8.5.28] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_161] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_161] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.28.jar:8.5.28] at java.lang.Thread.run(Thread.java:748) [na:1.8.0_161] ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2019, 18:48 |
|
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
|
|||
---|---|---|---|
#18+
XEugeneВылетает на вызове save. Думаю, меня больше устроил бы первый вариант. Но что нужно написать в pom.xml. Сейчас там нет никакого явного указания версии Hibernate. А посмотреть эффективный pom? Там сразу в свойствах версия прописана (на данный момент) - <hibernate.version>5.2.14.Final</hibernate.version> ... |
|||
:
Нравится:
Не нравится:
|
|||
23.03.2019, 23:29 |
|
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
|
|||
---|---|---|---|
#18+
XEugene, суете всякую гадость в проект, а потом страдаете, раз уж выбрали boot, то и используйте уже JPA, вот тут пишут что зависимости могут гадить . ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2019, 03:48 |
|
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
|
|||
---|---|---|---|
#18+
ПылинкаXEugeneВылетает на вызове save. Думаю, меня больше устроил бы первый вариант. Но что нужно написать в pom.xml. Сейчас там нет никакого явного указания версии Hibernate. А посмотреть эффективный pom? Там сразу в свойствах версия прописана (на данный момент) - <hibernate.version>5.2.14.Final</hibernate.version> В эффективном pom <hibernate.version>5.2.14.Final</hibernate.version>. Вопрос в том, как это изменить. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2019, 15:27 |
|
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
|
|||
---|---|---|---|
#18+
Андрей ПанфиловXEugene, суете всякую гадость в проект, а потом страдаете, раз уж выбрали boot, то и используйте уже JPA, вот тут пишут что зависимости могут гадить . ну с hibernat-ом даже в спринге можно работать без использования его обертки (как по-моему, то это уже перебор - обертка на обертку). А ведь хибернейт отнюдь не обязывался поддерживать совместимость с оберткой от спринга, а только с JPA, скорее наоборот. Тут, видимо, релизнули новую версию hibernate, а этот закуток не протестировали "оберточники", так и вставили в spring-boot-dependencies-2.0.0.RELEASE.pom новейшую версию - <hazelcast-hibernate5.version>1.2.3</hazelcast-hibernate5.version> <hibernate.version>5.2.14.Final</hibernate.version> <hibernate-validator.version>6.0.7.Final</hibernate-validator.version> Для меня это признак кризиса в разработке спринга . Они все гнали-разгоняли темпы, пытались "обернуть" вообще всё вокруг. А теперь ресурсов стало не хватать. Аналогично с gradle. Я в прошлом году решил проверить, кто же перспективнее. Обнаружилось тотальное отставание поддержки градлем (не выдержали темпов спринга) - фичи вовремя не дорабатываются, многие баги не фиксятся (ну я не считал - сколько, это из комментариев почерпнул) потому что целые большие куски поддерживаются практически единичными разработчиками (опять же из дискуссий). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2019, 15:36 |
|
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
|
|||
---|---|---|---|
#18+
Андрей ПанфиловXEugene, суете всякую гадость в проект, а потом страдаете, раз уж выбрали boot, то и используйте уже JPA, вот тут пишут что зависимости могут гадить . Использую JPA, что делать. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.03.2019, 20:30 |
|
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
|
|||
---|---|---|---|
#18+
Пылинкану с hibernat-ом даже в спринге можно работать без использования его обертки (как по-моему, то это уже перебор - обертка на обертку). А ведь хибернейт отнюдь не обязывался поддерживать совместимость с оберткой от спринга, а только с JPA, скорее наоборот. Тут, видимо, релизнули новую версию hibernate, а этот закуток не протестировали "оберточники", так и вставили в spring-boot-dependencies-2.0.0.RELEASE.pom новейшую версиюЧет не видно связи с версиями хибернейта, вот согласно этому: Код: java 1. 2. 3. 4. 5. 6. 7.
ТС хочет управлять транзакциями на стороне спринга, и да, это работает и версия хибера здесь мало на что влияет (если что-то древнее не брать), проблема возникает когда ТС начинает подмешивать в проект компоненты завязанные на JPA - в JPA транзакции работают не на уровне сессий хибера, а на уровне менеджера сущностей, что прямым текстом в исключении и написано: "org.springframework.orm.jpa.EntityManagerHolder cannot be cast to org.springframework.orm.hibernate5.SessionHolder" ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 05:10 |
|
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
|
|||
---|---|---|---|
#18+
Кстати, возник вопрос о транзакциях. Так как я теперь использую EntityManager вместо SessionFactory, то я переписал конфигурацию транзакций так. автор@SpringBootApplication @EnableAutoConfiguration(exclude = { DataSourceTransactionManagerAutoConfiguration.class }) public class ApplicationStarter { @Autowired @Bean(name = "transactionManager") public JpaTransactionManager getTransactionManager(EntityManagerFactory entityManagerFactory) { JpaTransactionManager transactionManager = new JpaTransactionManager(entityManagerFactory); return transactionManager; } И я вижу, что спринговые транзакции не работают. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
Если вторая вставка падает с SQLException, первая всё равно происходит. Если вручную использовать JPA транзакцию, то она работает. Но хотелось бы использовать @Transactional. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 13:18 |
|
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
|
|||
---|---|---|---|
#18+
XEugene, в жизни не поверю что хибер умеет кидать checked SQLException. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 13:38 |
|
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
|
|||
---|---|---|---|
#18+
Андрей ПанфиловXEugene, в жизни не поверю что хибер умеет кидать checked SQLException. Он кидает unchecked org.hibernate.exception.DataException. Попробовал так. Код: java 1. 2.
всё равно не откатывается транзакция. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 14:18 |
|
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
|
|||
---|---|---|---|
#18+
XEugene, java.lang.Exception unchecked или нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 14:28 |
|
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
|
|||
---|---|---|---|
#18+
Андрей ПанфиловXEugene, java.lang.Exception unchecked или нет? Если он RunTimeException, как в данном случае, то да. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 14:30 |
|
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
|
|||
---|---|---|---|
#18+
Создать свой checked exception и выбрасывать его при поимке DataException тоже не помогло. Код: java 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17.
... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 14:43 |
|
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
|
|||
---|---|---|---|
#18+
XEugeneЕсли он RunTimeException, как в данном случае, то да.точно, туплю. Код: java 1. 2.
вы новый EntityManager создаете каждый раз, а он будет к текущей транзакции подключаться, только если она JTA, а у вас JPA. Инжектите EntityManager через @javax.persistence.PersistenceContext, а не фабрику. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 14:51 |
|
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
|
|||
---|---|---|---|
#18+
Андрей Панфиловвы новый EntityManager создаете каждый раз, а он будет к текущей транзакции подключаться, только если она JTA, а у вас JPA. Инжектите EntityManager через @javax.persistence.PersistenceContext, а не фабрику.Да, теперь работает транзакция, спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.03.2019, 15:26 |
|
|
start [/forum/topic.php?fid=59&msg=39790503&tid=2121411]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
55ms |
get topic data: |
13ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
2ms |
others: | 16ms |
total: | 175ms |
0 / 0 |