无法解开请求的类型Javax.Sql.Datasource - Spring hibernate java config [英] Cannot unwrap to requested type Javax.Sql.Datasource - Spring hibernate java config

查看:223
本文介绍了无法解开请求的类型Javax.Sql.Datasource - Spring hibernate java config的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在努力争取在Spring Boot中使用Hibernate。我收到以下异常:


org.springframework.beans.factory.BeanCreationException:在创建名为'txManager'的bean时定义错误com.xxx.MegLabApplication:通过工厂方法的Bean实例化失败;嵌套异常是org.springframework.beans.BeanInstantiationException:无法实例化[org.springframework.orm.hibernate5.HibernateTransactionManager]:工厂方法'txManager'引发异常;嵌套的异常是org.hibernate.service.UnknownUnwrapTypeException:无法解开请求的类型[javax.sql.DataSource]


可以发现类似于这是缺乏c3p0连接池,但我有我的gradle构建文件中的c3p0的依赖关系,并将属性传递到休眠配置。



可以有人建议我如何修复这个配置?



谢谢

  import java.util.Properties; 

import org.apache.tomcat.jdbc.pool.DataSource;
import org.hibernate.SessionFactory;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
导入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);


私有属性getHibernateProperties()
{
属性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;

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


$Be $ b $ public HibernateTransactionManager txManager()
{
return new HibernateTransactionManager(sessionFactory());
}
}


解决方案

好的所以我终于得到了这一切... ...



Spring引导使用hibernate 4.3.11。我的原始配置中的HibernateTransactionManager类使用Hibernate5,因此我将类版本更改为4.我的C3P0依赖项也是版本5,所以我将它降级到了4版。



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

  prop .put(hibernate.connection.provider_class,org.hibernate.c3p0.internal.C3P0ConnectionProvider)



<希望这有助于任何人在晚些时候发现,直到Spring引导支持Hibernate 5.


I'm struggling to get hibernate working with Spring Boot. I'm getting the following exception:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'txManager' defined in com.xxx.MegLabApplication: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.orm.hibernate5.HibernateTransactionManager]: Factory method 'txManager' threw exception; nested exception is org.hibernate.service.UnknownUnwrapTypeException: Cannot unwrap to requested type [javax.sql.DataSource]

The only thing I can find similar to this is the lack of c3p0 connection pooling, but I have the dependencies for c3p0 in my gradle build file and the properties are passed into hibernates configuration.

Can anyone advise on how I can fix this configuration?

Thanks

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());
}
}

解决方案

Ok so I finally got this all working...

Spring boot uses hibernate 4.3.11. The HibernateTransactionManager class in my original config was using Hibernate5 so I changed the class version to 4. My C3P0 dependency was also version 5 so I downgraded it to 4.

I also had to add the connection details to the hibernate properties and explicitly tell it to use the C3P0 connection provider by specifying the class.

prop.put("hibernate.connection.provider_class", "org.hibernate.c3p0.internal.C3P0ConnectionProvider")

Hopefully this helps anyone coming across this later until Spring boot supports Hibernate 5.

这篇关于无法解开请求的类型Javax.Sql.Datasource - Spring hibernate java config的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆