Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder  [new]
XEugene
Member

Откуда:
Сообщений: 2388
Вылетает на вызове save.

@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:
@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 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]
23 мар 19, 18:48    [21841746]     Ответить | Цитировать Сообщить модератору
 Re: Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder  [new]
Пылинка
Member

Откуда: СПб
Сообщений: 359
XEugene
Вылетает на вызове save.

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


А посмотреть эффективный pom? Там сразу в свойствах версия прописана (на данный момент) -
<hibernate.version>5.2.14.Final</hibernate.version>
23 мар 19, 23:29    [21841818]     Ответить | Цитировать Сообщить модератору
 Re: Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3342
XEugene,

суете всякую гадость в проект, а потом страдаете, раз уж выбрали boot, то и используйте уже JPA, вот тут пишут что зависимости могут гадить.
24 мар 19, 03:48    [21841858]     Ответить | Цитировать Сообщить модератору
 Re: Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder  [new]
XEugene
Member

Откуда:
Сообщений: 2388
Пылинка
XEugene
Вылетает на вызове save.

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


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


В эффективном pom <hibernate.version>5.2.14.Final</hibernate.version>. Вопрос в том, как это изменить.
24 мар 19, 15:27    [21842119]     Ответить | Цитировать Сообщить модератору
 Re: Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder  [new]
Пылинка
Member

Откуда: СПб
Сообщений: 359
Андрей Панфилов
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 мар 19, 15:36    [21842130]     Ответить | Цитировать Сообщить модератору
 Re: Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder  [new]
XEugene
Member

Откуда:
Сообщений: 2388
Андрей Панфилов
XEugene,

суете всякую гадость в проект, а потом страдаете, раз уж выбрали boot, то и используйте уже JPA, вот тут пишут что зависимости могут гадить.

Использую JPA, что делать.
24 мар 19, 20:30    [21842245]     Ответить | Цитировать Сообщить модератору
 Re: Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3342
Пылинка
ну с hibernat-ом даже в спринге можно работать без использования его обертки (как по-моему, то это уже перебор - обертка на обертку).
А ведь хибернейт отнюдь не обязывался поддерживать совместимость с оберткой от спринга, а только с JPA, скорее наоборот.
Тут, видимо, релизнули новую версию hibernate, а этот закуток не протестировали "оберточники", так и вставили в
spring-boot-dependencies-2.0.0.RELEASE.pom новейшую версию
Чет не видно связи с версиями хибернейта, вот согласно этому:
    @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"
25 мар 19, 05:10    [21842369]     Ответить | Цитировать Сообщить модератору
 Re: Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder  [new]
XEugene
Member

Откуда:
Сообщений: 2388
Кстати, возник вопрос о транзакциях. Так как я теперь использую 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;
}




И я вижу, что спринговые транзакции не работают.

    @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.
25 мар 19, 13:18    [21842709]     Ответить | Цитировать Сообщить модератору
 Re: Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3342
XEugene,

в жизни не поверю что хибер умеет кидать checked SQLException.
25 мар 19, 13:38    [21842733]     Ответить | Цитировать Сообщить модератору
 Re: Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder  [new]
XEugene
Member

Откуда:
Сообщений: 2388
Андрей Панфилов
XEugene,

в жизни не поверю что хибер умеет кидать checked SQLException.

Он кидает unchecked org.hibernate.exception.DataException.

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


всё равно не откатывается транзакция.
25 мар 19, 14:18    [21842798]     Ответить | Цитировать Сообщить модератору
 Re: Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3342
XEugene,

java.lang.Exception unchecked или нет?
25 мар 19, 14:28    [21842807]     Ответить | Цитировать Сообщить модератору
 Re: Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder  [new]
XEugene
Member

Откуда:
Сообщений: 2388
Андрей Панфилов
XEugene,

java.lang.Exception unchecked или нет?

Если он RunTimeException, как в данном случае, то да.
25 мар 19, 14:30    [21842811]     Ответить | Цитировать Сообщить модератору
 Re: Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder  [new]
XEugene
Member

Откуда:
Сообщений: 2388
Создать свой checked exception и выбрасывать его при поимке DataException тоже не помогло.

    @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());
        }
25 мар 19, 14:43    [21842838]     Ответить | Цитировать Сообщить модератору
 Re: Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder  [new]
Андрей Панфилов
Member

Откуда: Москва > Melbourne
Сообщений: 3342
XEugene
Если он RunTimeException, как в данном случае, то да.
точно, туплю.

        EntityManager entityManager = entityManagerFactory.createEntityManager();
        Session session = entityManager.unwrap(Session.class);


вы новый EntityManager создаете каждый раз, а он будет к текущей транзакции подключаться, только если она JTA, а у вас JPA. Инжектите EntityManager через @javax.persistence.PersistenceContext, а не фабрику.
25 мар 19, 14:51    [21842847]     Ответить | Цитировать Сообщить модератору
 Re: Spring Boot и Hibernate: EntityManagerHolder cannot be cast to SessionHolder  [new]
XEugene
Member

Откуда:
Сообщений: 2388
Андрей Панфилов
вы новый EntityManager создаете каждый раз, а он будет к текущей транзакции подключаться, только если она JTA, а у вас JPA. Инжектите EntityManager через @javax.persistence.PersistenceContext, а не фабрику.
Да, теперь работает транзакция, спасибо.
25 мар 19, 15:26    [21842885]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить