powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
15 сообщений из 15, страница 1 из 1
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
    #39790469
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вылетает на вызове 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
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
    #39790503
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XEugeneВылетает на вызове save.

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


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

суете всякую гадость в проект, а потом страдаете, раз уж выбрали boot, то и используйте уже JPA, вот тут пишут что зависимости могут гадить .
...
Рейтинг: 0 / 0
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
    #39790619
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пылинка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
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
    #39790622
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей Панфилов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
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
    #39790671
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Андрей ПанфиловXEugene,

суете всякую гадость в проект, а потом страдаете, раз уж выбрали boot, то и используйте уже JPA, вот тут пишут что зависимости могут гадить .
Использую JPA, что делать.
...
Рейтинг: 0 / 0
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
    #39790721
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пылинкану с 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
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
    #39790908
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, возник вопрос о транзакциях. Так как я теперь использую 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
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
    #39790918
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XEugene,

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

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

java.lang.Exception unchecked или нет?
Если он RunTimeException, как в данном случае, то да.
...
Рейтинг: 0 / 0
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
    #39790974
XEugene
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создать свой 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
Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder
    #39790979
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XEugeneЕсли он RunTimeException, как в данном случае, то да.точно, туплю.

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



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


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