首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法打开请求类型的Javax.Sql.Datasource - Spring java配置。

无法打开请求类型的Javax.Sql.Datasource - Spring java配置。
EN

Stack Overflow用户
提问于 2016-01-12 17:23:39
回答 1查看 4.2K关注 0票数 1

我很难让hibernate和Spring一起工作。我得到了以下例外:

org.springframework.beans.factory.BeanCreationException:错误创建名为“txManager”的bean : Bean通过工厂方法实例化失败;嵌套异常是org.springframework.beans.BeanInstantiationException:未能实例化org.springframework.orm.hibernate5.HibernateTransactionManager:工厂方法'txManager‘抛出的异常;嵌套异常是org.hibernate.service.UnknownUnwrapTypeException:不能打开请求的javax.sql.DataSource类型

我能找到的唯一相似之处是缺少c3p0连接池,但是我的gradle构建文件中有c3p0的依赖项,属性被传递到hibernates配置中。

有人能建议我如何修复这个配置吗?

谢谢

代码语言:javascript
复制
import java.util.Properties;

import org.apache.tomcat.jdbc.pool.DataSource;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistry;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBuilder; 
import org.springframework.transaction.annotation.EnableTransactionManagement;

@EnableTransactionManagement
@SpringBootApplication
public class MegLabApplication
{

public static void main(String[] args)
{
    SpringApplication.run(MegLabApplication.class, args);
}

@Value("${spring.datasource.driverClassName}")
private String databaseDriverClassName;

@Value("${spring.datasource.url}")
private String datasourceUrl;

@Value("${spring.datasource.username}")
private String databaseUsername;

@Value("${spring.datasource.password}")
private String databasePassword;

@Bean
public SessionFactory sessionFactory()
{
    Configuration configuration = new Configuration();
    configuration.setProperties(getHibernateProperties());

    ServiceRegistry serviceRegistry = new StandardServiceRegistryBuilder()
            .applySettings(configuration.getProperties()).build();

    LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource());

    builder.scanPackages("com.xxx.models");

    return builder.buildSessionFactory(serviceRegistry);
}

private Properties getHibernateProperties()
{
    Properties prop = new Properties();
    prop.put("hibernate.connection.pool_size", "10");

    prop.put("hibernate.c3p0.min_size", "5");
    prop.put("hibernate.c3p0.max_size", "20");
    prop.put("hibernate.c3p0.timeout", "300");
    prop.put("hibernate.c3p0.max_statements", "50");
    prop.put("hibernate.c3p0.idle_test_period", "60");

    prop.put("hibernate.format_sql", "true");
    prop.put("hibernate.show_sql", "true");
    prop.put("hibernate.dialect", "org.hibernate.dialect.MySQL5InnoDBDialect");
    prop.put("hibernate.hbm2ddl.auto", "update");
    return prop;
}

@Bean(name = "dataSource")
public DataSource dataSource()
{
    DataSource ds = new DataSource();
    ds.setDriverClassName(databaseDriverClassName);
    ds.setUrl(datasourceUrl);
    ds.setUsername(databaseUsername);
    ds.setPassword(databasePassword);
    return ds;
}

@Bean
public HibernateTransactionManager txManager()
{
    return new HibernateTransactionManager(sessionFactory());
}
}
EN

回答 1

Stack Overflow用户

发布于 2016-01-12 23:14:34

好吧,我终于把这一切都做好了.

Spring引导使用hibernate 4.3.11。我最初配置中的HibernateTransactionManager类使用的是Hibernate5,因此我将类版本更改为4,我的C3P0依赖项也是版本5,因此我将其降级为4。

我还必须将连接细节添加到hibernate属性中,并通过指定类显式地告诉它使用C3P0连接提供程序。

代码语言:javascript
复制
prop.put("hibernate.connection.provider_class", "org.hibernate.c3p0.internal.C3P0ConnectionProvider")

希望这能帮助任何在Spring支持Hibernate 5之前遇到这种情况的人。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34750036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档