Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder / 15 сообщений из 15, страница 1 из 1
23.03.2019, 18:48
    #39790469
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
Вылетает на вызове save.

Код: java
1.
2.
3.
4.
5.
6.
@Autowired
private SessionFactory sessionFactory;

public NewFieldInfo addField(Field field) {
    Session session = sessionFactory.getCurrentSession();
    session.save(field);



Нагуглил два возможных решения этой проблемы: даунгрейдить версию хибернета ниже 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.
@SpringBootApplication
@EnableAutoConfiguration(exclude = {
        DataSourceAutoConfiguration.class,
        DataSourceTransactionManagerAutoConfiguration.class,
        HibernateJpaAutoConfiguration.class })
public class ApplicationStarter {

    @Autowired
    private Environment env;

    public static void main(String[] args) throws Exception {
        SpringApplication.run(ApplicationStarter.class, args);
    }

    @Bean(name = "dataSource")
    public DataSource getDataSource() {
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(env.getProperty("spring.datasource.driver-class-name"));
        dataSource.setUrl(env.getProperty("spring.datasource.url"));
        dataSource.setUsername(env.getProperty("spring.datasource.username"));
        dataSource.setPassword(env.getProperty("spring.datasource.password"));

        return dataSource;
    }

    @Autowired
    @Bean(name = "sessionFactory")
    public SessionFactory getSessionFactory(DataSource dataSource) throws Exception {
        Properties properties = new Properties();

        properties.put("hibernate.dialect", env.getProperty("spring.jpa.properties.hibernate.dialect"));
        properties.put("hibernate.show_sql", env.getProperty("spring.jpa.show-sql"));
        properties.put("current_session_context_class", //
                env.getProperty("spring.jpa.properties.hibernate.current_session_context_class"));

        LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();
        factoryBean.setPackagesToScan(new String[] { "" });
        factoryBean.setDataSource(dataSource);
        factoryBean.setHibernateProperties(properties);
        factoryBean.afterPropertiesSet();
        SessionFactory sf = factoryBean.getObject();
        return sf;
    }

    @Autowired
    @Bean(name = "transactionManager")
    public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory);

        return transactionManager;
    }




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.
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.fields</groupId>
    <artifactId>fields</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.threeten</groupId>
            <artifactId>threetenbp</artifactId>
            <version>1.3.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>



Нагуглил два возможных решения этой проблемы: даунгрейдить версию хибернета ниже 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]
...
Рейтинг: 0 / 0
23.03.2019, 23:29
    #39790503
Пылинка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
XEugeneВылетает на вызове save.

Думаю, меня больше устроил бы первый вариант. Но что нужно написать в pom.xml. Сейчас там нет никакого явного указания версии Hibernate.


А посмотреть эффективный pom? Там сразу в свойствах версия прописана (на данный момент) -
<hibernate.version>5.2.14.Final</hibernate.version>
...
Рейтинг: 0 / 0
24.03.2019, 03:48
    #39790524
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
XEugene,

суете всякую гадость в проект, а потом страдаете, раз уж выбрали boot, то и используйте уже JPA, вот тут пишут что зависимости могут гадить .
...
Рейтинг: 0 / 0
24.03.2019, 15:27
    #39790619
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
ПылинкаXEugeneВылетает на вызове save.

Думаю, меня больше устроил бы первый вариант. Но что нужно написать в pom.xml. Сейчас там нет никакого явного указания версии Hibernate.


А посмотреть эффективный pom? Там сразу в свойствах версия прописана (на данный момент) -
<hibernate.version>5.2.14.Final</hibernate.version>

В эффективном pom <hibernate.version>5.2.14.Final</hibernate.version>. Вопрос в том, как это изменить.
...
Рейтинг: 0 / 0
24.03.2019, 15:36
    #39790622
Пылинка
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
Андрей Панфилов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. Я в прошлом году решил проверить, кто же перспективнее. Обнаружилось тотальное отставание поддержки градлем (не выдержали темпов спринга) - фичи вовремя не дорабатываются, многие баги не фиксятся (ну я не считал - сколько, это из комментариев почерпнул) потому что целые большие куски поддерживаются практически единичными разработчиками (опять же из дискуссий).
...
Рейтинг: 0 / 0
24.03.2019, 20:30
    #39790671
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
Андрей ПанфиловXEugene,

суете всякую гадость в проект, а потом страдаете, раз уж выбрали boot, то и используйте уже JPA, вот тут пишут что зависимости могут гадить .
Использую JPA, что делать.
...
Рейтинг: 0 / 0
25.03.2019, 05:10
    #39790721
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
Пылинкану с hibernat-ом даже в спринге можно работать без использования его обертки (как по-моему, то это уже перебор - обертка на обертку).
А ведь хибернейт отнюдь не обязывался поддерживать совместимость с оберткой от спринга, а только с JPA, скорее наоборот.
Тут, видимо, релизнули новую версию hibernate, а этот закуток не протестировали "оберточники", так и вставили в
spring-boot-dependencies-2.0.0.RELEASE.pom новейшую версиюЧет не видно связи с версиями хибернейта, вот согласно этому:
Код: java
1.
2.
3.
4.
5.
6.
7.
    @Autowired
    @Bean(name = "transactionManager")
    public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory);

        return transactionManager;
    }

ТС хочет управлять транзакциями на стороне спринга, и да, это работает и версия хибера здесь мало на что влияет (если что-то древнее не брать), проблема возникает когда ТС начинает подмешивать в проект компоненты завязанные на JPA - в JPA транзакции работают не на уровне сессий хибера, а на уровне менеджера сущностей, что прямым текстом в исключении и написано: "org.springframework.orm.jpa.EntityManagerHolder cannot be cast to org.springframework.orm.hibernate5.SessionHolder"
...
Рейтинг: 0 / 0
25.03.2019, 13:18
    #39790908
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
Кстати, возник вопрос о транзакциях. Так как я теперь использую 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.
    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = SQLException.class)
    public NewFieldInfo addField(Account account, Field field) throws SQLException {

        EntityManager entityManager = entityManagerFactory.createEntityManager();
        Session session = entityManager.unwrap(Session.class);
        ...
        ...
        if (existingAccount == null) {
            session.save(account);
            field.setAccount(account);
        } else {
            field.setAccount(existingAccount);
        }

        session.save(field);// если здесь происходит SQLException,  сохранение session.save(account) не откатывается



Если вторая вставка падает с SQLException, первая всё равно происходит. Если вручную использовать JPA транзакцию, то она работает. Но хотелось бы использовать @Transactional.
...
Рейтинг: 0 / 0
25.03.2019, 13:38
    #39790918
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
XEugene,

в жизни не поверю что хибер умеет кидать checked SQLException.
...
Рейтинг: 0 / 0
25.03.2019, 14:18
    #39790955
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
Андрей ПанфиловXEugene,

в жизни не поверю что хибер умеет кидать checked SQLException.
Он кидает unchecked org.hibernate.exception.DataException.

Попробовал так.
Код: java
1.
2.
    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
    public NewFieldInfo addField(Account account, Field field) throws Exception { 



всё равно не откатывается транзакция.
...
Рейтинг: 0 / 0
25.03.2019, 14:28
    #39790960
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
XEugene,

java.lang.Exception unchecked или нет?
...
Рейтинг: 0 / 0
25.03.2019, 14:30
    #39790962
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
Андрей ПанфиловXEugene,

java.lang.Exception unchecked или нет?
Если он RunTimeException, как в данном случае, то да.
...
Рейтинг: 0 / 0
25.03.2019, 14:43
    #39790974
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
Создать свой checked exception и выбрасывать его при поимке DataException тоже не помогло.

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
    @Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = AddFieldException.class)
    public NewFieldInfo addField(Account account, Field field) throws AddFieldException {

        .......

        if (existingAccount == null) {
            session.save(account);
            field.setAccount(account);
        } else {
            field.setAccount(existingAccount);
        }

        try {
            session.save(field);
        } catch (DataException e) {
            throw new AddFieldException(e.getMessage());
        }
...
Рейтинг: 0 / 0
25.03.2019, 14:51
    #39790979
Андрей Панфилов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
XEugeneЕсли он RunTimeException, как в данном случае, то да.точно, туплю.

Код: java
1.
2.
        EntityManager entityManager = entityManagerFactory.createEntityManager();
        Session session = entityManager.unwrap(Session.class);



вы новый EntityManager создаете каждый раз, а он будет к текущей транзакции подключаться, только если она JTA, а у вас JPA. Инжектите EntityManager через @javax.persistence.PersistenceContext, а не фабрику.
...
Рейтинг: 0 / 0
25.03.2019, 15:26
    #39790998
XEugene
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
Андрей Панфиловвы новый EntityManager создаете каждый раз, а он будет к текущей транзакции подключаться, только если она JTA, а у вас JPA. Инжектите EntityManager через @javax.persistence.PersistenceContext, а не фабрику.Да, теперь работает транзакция, спасибо.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]