【问题标题】:EntityManagerHolder cannot be cast to org.springframework.orm.hibernate5.SessionHolderEntityManagerHolder 不能转换为 org.springframework.orm.hibernate5.SessionHolder
【发布时间】:2018-12-20 00:20:46
【问题描述】:

我正在使用这段代码来配置带有 Hibernate 的 Spring:

@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 cannot be cast to org.springframework.orm.hibernate5.SessionHolder

Spring 4 + Hibernate 5 = org.springframework.orm.jpa.EntityManagerHolder cannot be cast to org.springframework.orm.hibernate5.SessionHolder

还有其他我可以使用的解决方案吗?以上解决方案是快速破解。

【问题讨论】:

  • 要么将hibernate降级到SessionFactory..你为什么还需要它?
  • @M.Deinum 我从教程中拿了这个例子。如果我删除会话工厂,我如何进行 Hibernate 查询?有没有示例项目?
  • 我用过这个教程baeldung.com/hibernate-5-spring
  • 为什么需要休眠查询。使用 JPA 查询。 Hibernate 是一个 JPA 实现,从它开始。如果你真的需要休眠,你总是可以获取底层会话,但首先从 JPA 开始,而不是简单的休眠。如果你真的想要Session 使用EntityManager 来获得它,使用EntityManager.unwrap(Session.class)
  • 你能在这里粘贴示例代码作为官方答案吗?

标签: spring hibernate spring-boot hibernate-search hibernate-ogm


【解决方案1】:

随着 Hibernate 5.2 的发布,SessionFactory 扩展了 EntityManagerFactory 接口。这导致SessionFactory 也是EntityManagerFactory

在以前的休眠版本中,情况并非如此。

简单的解决方案是将休眠版本降级到

或者甚至更好的是不要使用普通的SessionFactory,而是让 Spring Boot 自动配置 EntityManagerFactory(如果检测到休眠,则默认完成)并使用它而不是普通的 Hibernate。

【讨论】:

  • 我必须降级到1.5,但是这个时候有没有其他方法可以进行这个配置呢?或者我可以在我的 pom.xml 中导入 hibernate 并将它与 springboot hibernate 分开使用吗?
  • @rfcabal 没有人告诉你降级到这么旧的版本; 1.5 太旧了,几乎什么都可以使用
猜你喜欢
  • 2017-03-30
  • 2017-07-17
  • 2017-12-10
  • 1970-01-01
  • 2016-12-02
  • 2019-08-01
  • 2016-02-15
  • 2017-02-19
相关资源
最近更新 更多