Spring4集成Hibernate5.2(从Hibernate4迁移)Tomcat启动失败如何解决
Hibernate4迁移至Hibernate5.2+Spring4启动失败配置问题排查
以下是你配置中的典型错误及修复方案:
- 包引用错误:Hibernate5对应的
LocalSessionFactoryBean和HibernateTransactionManager必须使用org.springframework.orm.hibernate5包下的类,不能继续使用hibernate4包下的旧实现,这是迁移时最常见的遗漏点。 - 缺少Hibernate方言配置:你使用的是MySQL8的
com.mysql.cj.jdbc.Driver驱动,Hibernate5不会默认推断数据库方言,必须显式配置对应方言属性。 - 事务管理器注入方式错误:直接调用
getSessionFactory().getObject()会导致SessionFactory重复初始化,正确做法是将SessionFactory作为参数传入事务管理器的Bean方法,由Spring自动注入已经实例化完成的SessionFactory单例。 - Spring版本兼容性问题:Hibernate5.2最低要求Spring 4.3.x及以上版本,如果你的Spring版本低于4.3,会出现类不兼容的启动错误。
- 依赖缺失:Hibernate5的c3p0连接池实现已经从核心包中拆分出来,需要单独引入对应版本的
hibernate-c3p0依赖,否则Hibernate无法加载c3p0连接池,启动报错。 - JDBC连接参数缺失:MySQL8的cj驱动要求配置时区参数,否则会抛出连接异常。
修正后的配置代码如下:
@Configuration @EnableTransactionManagement @ComponentScan(basePackages = { "com.social.*","com.*" }) public class HBConfig { @Bean public LocalSessionFactoryBean getSessionFactory() { // 注意此处使用的是hibernate5包下的LocalSessionFactoryBean LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean(); Properties props = new Properties(); // 设置JDBC属性 props.put("hibernate.connection.driver_class", "com.mysql.cj.jdbc.Driver"); props.put("hibernate.connection.url", "jdbc:mysql://localhost:3306/socialdev?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8&useSSL=false"); props.put("hibernate.connection.username", "root"); props.put("hibernate.connection.password","123"); // 新增必选的方言配置 props.put("hibernate.dialect", "org.hibernate.dialect.MySQL8Dialect"); // 设置Hibernate属性 props.put("hibernate.show_sql", true); props.put("hibernate.hbm2ddl.auto", "update"); // 设置C3P0连接池属性 props.put("hibernate.c3p0.min_size", 5); props.put("hibernate.c3p0.max_size", 20); props.put("hibernate.c3p0.acquire_increment", 1); props.put("hibernate.c3p0.timeout", 1800); props.put("hibernate.c3p0.max_statements", 150); factoryBean.setHibernateProperties(props); factoryBean.setPackagesToScan("com.social.entity"); return factoryBean; } @Bean public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) { // 注意此处使用的是hibernate5包下的HibernateTransactionManager HibernateTransactionManager transactionManager = new HibernateTransactionManager(); // 直接注入Spring托管的sessionFactory实例,不需要手动调用getObject transactionManager.setSessionFactory(sessionFactory); return transactionManager; } }
内容的提问来源于stack exchange,提问作者deepak mishra
相关产品推荐
相关产品推荐

