EntityManagerHolder не может быть приведен к org.springframework.orm.hibernate5.SessionHolder

Я использую этот код для настройки Spring с Hibernate:

@SpringBootApplication
@Configuration
@EnableTransactionManagement
public class ContextServer {

    @Bean
    public LocalSessionFactoryBean getSessionFactory() {
        LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();

        try {
            sessionFactory.setDataSource(dataSource());
        } catch (NamingException e) {
            e.printStackTrace();
        }
        sessionFactory.setPackagesToScan(new String[] { "org.plugin.database.models" });
        sessionFactory.setHibernateProperties(hibernateProperties());
        // factoryBean.setAnnotatedClasses(User.class, Authorities.class);

        return sessionFactory;
    }

    @Bean
    public DataSource dataSource() throws NamingException {
        return (DataSource) new JndiTemplate().lookup("java:/global/production_gateway");
    }

    private final Properties hibernateProperties() {
        final Properties hibernateProperties = new Properties();
        hibernateProperties.setProperty("hibernate.hbm2ddl.auto", "create-drop");
        hibernateProperties.setProperty("hibernate.dialect", "org.hibernate.dialect.MariaDBDialect");
        hibernateProperties.setProperty("hibernate.show_sql", "true");
        hibernateProperties.setProperty("hibernate.format_sql", "true");

        return hibernateProperties;
    }

    @Bean
    public HibernateTransactionManager getTransactionManager() {
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(getSessionFactory().getObject());
        return transactionManager;
    }
}

Я использую фабрику следующим образом:

@Component("authorize")
@Transactional
public class AuthorizeService implements MessageProcessor {

    @Autowired
    SessionFactory sessionFactory;


    @Override
    public void processMessage(.....) {     

        Session session = sessionFactory.getCurrentSession();
    }

Но я получаю исключение:

java.lang.ClassCastException: 
org.springframework.orm.jpa.EntityManagerHolder cannot be cast to 
org.springframework.orm.hibernate5.SessionHolder

Я нашел эти ответы: ClassCastException: org.springframework.orm.jpa .EntityManagerHolder нельзя преобразовать в org.springframework.orm.hibernate5.SessionHolder

Spring 4 + Hibernate 5 = org.springframework.orm. jpa.EntityManagerHolder нельзя преобразовать в org.springframework.orm.hibernate5.SessionHolder

Есть ли другое решение, которое я могу использовать? Вышеупомянутые решения - это быстрые взломы.


person Peter Penzov    schedule 11.07.2018    source источник
comment
Либо понизьте гибернацию до версии 5.2, либо не используйте SessionFactory.. Зачем вам это вообще нужно?   -  person M. Deinum    schedule 12.07.2018
comment
@M.Deinum M.Deinum Я взял этот пример из учебника. Если я удалю фабрику сеансов, как я могу выполнять запросы Hibernate? Есть пример проекта?   -  person Peter Penzov    schedule 12.07.2018
comment
Я использовал это руководство baeldung.com/hibernate-5-spring.   -  person Peter Penzov    schedule 12.07.2018
comment
Зачем вам нужны спящие запросы. Используйте JPA-запросы. Hibernate — это реализация JPA, начните с этого. Если вам действительно нужен спящий режим, вы всегда можете получить базовый сеанс, но сначала начните с JPA, а не с простого спящего режима. Если вы действительно хотите Session, используйте EntityManager, чтобы получить его, используя EntityManager.unwrap(Session.class).   -  person M. Deinum    schedule 12.07.2018
comment
Не могли бы вы вставить сюда пример кода в качестве официального ответа?   -  person Peter Penzov    schedule 12.07.2018
comment
Мне нужно сделать запросы Hibernate.   -  person Peter Penzov    schedule 12.07.2018
comment
Нет, нет... Как вы думаете, почему вам нужны спящие запросы...   -  person M. Deinum    schedule 12.07.2018
comment
Продолжим основную тему. Следуя руководству, которое я пытался реализовать, как решить проблему с кастингом?   -  person Peter Penzov    schedule 12.07.2018
comment
Как указано, понизить спящий режим.   -  person M. Deinum    schedule 12.07.2018
comment
Хорошо, но мне это кажется проблемой Hibernate. Как это будет использоваться в будущих версиях, если разработчики Hibernate не изменят его?   -  person Peter Penzov    schedule 12.07.2018
comment
В спящем режиме 5.2 Sessionfactory расширяет EntitymanagerFactory и приводит к тому, что Spring 5 думает, что использует JPA. Это будет исправлено в Spring 5.1, но решения для 5.0 нет. Как уже говорилось, я очень сомневаюсь, что вам нужен простой спящий режим для вашего варианта использования. Я подозреваю, что у вас одинаково хорошо получается использовать настроенный по умолчанию EntityManagerFactory с Spring Boot (кстати, в учебнике не используется Spring Boot, что также меняет ситуацию!) И просто используйте EntityManager для выполнения тех же запросов.   -  person M. Deinum    schedule 12.07.2018
comment
Спасибо за дополнительную информацию. Как я могу использовать EntityManager? Можете ли вы сослаться на какой-нибудь учебник?   -  person Peter Penzov    schedule 12.07.2018
comment
Просто удалите фабрику сеансов и диспетчер транзакций. И вместо @Autowired SessionFactory используйте @PersistenceContext EntityManager entityManager (что примерно эквивалентно Session). Кроме того, ваша конфигурация по-прежнему не использует Spring Boot (по крайней мере, кажется, что нет метода main для загрузки вашего приложения).   -  person M. Deinum    schedule 12.07.2018
comment
Вы можете увидеть мой основной метод здесь: > stackoverflow.com/questions/51242707/ Я использую WebApplicationInitializer   -  person Peter Penzov    schedule 12.07.2018
comment
Используя Spring Boot, вы должны использовать не обычную WebApplicationInitializer, а специализированную версию Spring Boot, если вы этого не сделаете, вы не используете Spring Boot (что приведет ко всевозможным странностям, если вы действительно ожидаете, что это произойдет, и также для людей, отвечающих на ваши вопросы, поскольку на самом деле вы не используете Spring Boot).   -  person M. Deinum    schedule 12.07.2018
comment
хорошо, я попытаюсь реорганизовать свой код.   -  person Peter Penzov    schedule 12.07.2018
comment
Можете ли вы вставить официальный ответ, чтобы я мог проголосовать за ответ?   -  person Peter Penzov    schedule 12.07.2018


Ответы (1)


С выпуском Hibernate 5.2 SessionFactory расширяет интерфейс EntityManagerFactory. Это приводит к тому, что SessionFactory также является EntityManagerFactory.

В предыдущих версиях спящего режима этого не было.

Простое решение — понизить версию спящего режима до версии ‹ 5.2, поскольку решения для Spring 5.0 нет (будет в Spring 5.1).

Или, возможно, даже лучше не использовать простой SessionFactory и позволить Spring Boot автоматически настроить EntityManagerFactory (выполняется по умолчанию, если обнаружен спящий режим) и использовать его вместо простого спящего режима.

person M. Deinum    schedule 12.07.2018
comment
Мне нужно перейти на версию 1.5, но в настоящее время есть ли другой способ сделать эту конфигурацию? или я могу импортировать спящий режим в свой pom.xml и использовать его отдельно от спящего режима Springboot? - person rfcabal; 07.12.2018
comment
@rfcabal никто не говорил вам переходить на такую ​​старую версию; 1.5 настолько устарела, что почти ни с чем не работает - person Pere; 17.06.2021