冬眠+;postgres java.lang.ClassNotFoundException:jdbc.driverClassName

冬眠+;postgres java.lang.ClassNotFoundException:jdbc.driverClassName,java,postgresql,hibernate,maven,intellij-idea,Java,Postgresql,Hibernate,Maven,Intellij Idea,我将hibernate和postgres 9.6与intellij idea和maven一起使用。 这是我的hibernate课程 @Configuration @EnableTransactionManagement @PropertySource({"classpath:psql_config.properties"}) public class HibernateConfig { @Autowired private Environment env; @Bean

我将hibernate和postgres 9.6与intellij idea和maven一起使用。 这是我的hibernate课程

@Configuration
@EnableTransactionManagement
@PropertySource({"classpath:psql_config.properties"})
public class HibernateConfig {
    @Autowired
    private Environment env;

    @Bean
    public LocalSessionFactoryBean sessionFactory(){
        LocalSessionFactoryBean sessionFactory  = new LocalSessionFactoryBean();
        sessionFactory.setDataSource(restDataSource());
        sessionFactory.setPackagesToScan(new String[] {"ru.amoup"});
        sessionFactory.setHibernateProperties(hibernateProperties());
        return sessionFactory;
    }

    @Bean
    public DataSource restDataSource(){
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("jdbc.driverClassName");
        dataSource.setUrl("jdbc.url");
        dataSource.setUsername("jdbc.user");
        dataSource.setPassword("jdbc.pass");
        return dataSource;
    }

    @Bean
    @Autowired
    public HibernateTransactionManager transactionManager(SessionFactory sessionFactory){
        HibernateTransactionManager txManager = new HibernateTransactionManager();
        txManager.setSessionFactory(sessionFactory);
        return txManager;
    }

    Properties hibernateProperties(){
        return new Properties(){
            {
                setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
                setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
                setProperty("hibernate.globally_quoted_identifiers", "true");
            }
        };
    }

    @Bean
    public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
        return new PersistenceExceptionTranslationPostProcessor();
    }
}
这是我的属性文件

# postgresql
jdbc.driverClassName = org.postgresql.Driver
jdbc.url = jdbc:postgresql://localhost:5432/integration
jdbc.user = myuser
jdbc.pass = mypass

# hibernate.X
hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
hibernate.show_sql=false
hibernate.hbm2ddl.auto = validate
在maven中,我有依赖性

<dependency>
  <groupId>org.postgresql</groupId>
  <artifactId>postgresql</artifactId>
  <version>42.1.4</version>
</dependency>

但是它工作得很好!我做错了什么?

当您设置数据源时,实际上并没有引用属性,您只是向它提供了包含属性键的字符串

您必须执行以下操作:

//class level variable
@Value("${jdbc.driverClassName}")
private String driverClassName;

//....
dataSource.setDriverClassName(driverClassName);
env.getProperty("jdbc.driverClassName")
@Bean
public DataSource restDataSource(){
    final BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
    dataSource.setUrl(env.getProperty("jdbc.url"));
    dataSource.setUsername(env.getProperty("jdbc.user"));
    dataSource.setPassword(env.getProperty("jdbc.pass"));
    return dataSource;
}

当您设置数据源时,实际上并没有引用属性,您只是为它提供了包含属性键的字符串

您必须执行以下操作:

//class level variable
@Value("${jdbc.driverClassName}")
private String driverClassName;

//....
dataSource.setDriverClassName(driverClassName);
env.getProperty("jdbc.driverClassName")
@Bean
public DataSource restDataSource(){
    final BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
    dataSource.setUrl(env.getProperty("jdbc.url"));
    dataSource.setUsername(env.getProperty("jdbc.user"));
    dataSource.setPassword(env.getProperty("jdbc.pass"));
    return dataSource;
}

您试图将jdbc.driverClassName设置为驱动程序类,而不是此属性的值

所以,使用类似这样的方法:

//class level variable
@Value("${jdbc.driverClassName}")
private String driverClassName;

//....
dataSource.setDriverClassName(driverClassName);
env.getProperty("jdbc.driverClassName")
@Bean
public DataSource restDataSource(){
    final BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
    dataSource.setUrl(env.getProperty("jdbc.url"));
    dataSource.setUsername(env.getProperty("jdbc.user"));
    dataSource.setPassword(env.getProperty("jdbc.pass"));
    return dataSource;
}
使用这种方法,您的bean配置将如下所示:

//class level variable
@Value("${jdbc.driverClassName}")
private String driverClassName;

//....
dataSource.setDriverClassName(driverClassName);
env.getProperty("jdbc.driverClassName")
@Bean
public DataSource restDataSource(){
    final BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
    dataSource.setUrl(env.getProperty("jdbc.url"));
    dataSource.setUsername(env.getProperty("jdbc.user"));
    dataSource.setPassword(env.getProperty("jdbc.pass"));
    return dataSource;
}
另一种方法是使用属性占位符,在这种情况下,您需要配置,如下所示:

@Value("${jdbc.driverClassName}")
private String driverClassName;

@Value("${jdbc.url}")
private String url;

@Value("${jdbc.user}")
private String username;

@Value("${jdbc.pass}")
private String password;

@Bean
public DataSource restDataSource(){
    final BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName(driverClassName);
    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    return dataSource;
}

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholder() {
    return new PropertySourcesPlaceholderConfigurer();
}

您试图将jdbc.driverClassName设置为驱动程序类,而不是此属性的值

所以,使用类似这样的方法:

//class level variable
@Value("${jdbc.driverClassName}")
private String driverClassName;

//....
dataSource.setDriverClassName(driverClassName);
env.getProperty("jdbc.driverClassName")
@Bean
public DataSource restDataSource(){
    final BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
    dataSource.setUrl(env.getProperty("jdbc.url"));
    dataSource.setUsername(env.getProperty("jdbc.user"));
    dataSource.setPassword(env.getProperty("jdbc.pass"));
    return dataSource;
}
使用这种方法,您的bean配置将如下所示:

//class level variable
@Value("${jdbc.driverClassName}")
private String driverClassName;

//....
dataSource.setDriverClassName(driverClassName);
env.getProperty("jdbc.driverClassName")
@Bean
public DataSource restDataSource(){
    final BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName(env.getProperty("jdbc.driverClassName"));
    dataSource.setUrl(env.getProperty("jdbc.url"));
    dataSource.setUsername(env.getProperty("jdbc.user"));
    dataSource.setPassword(env.getProperty("jdbc.pass"));
    return dataSource;
}
另一种方法是使用属性占位符,在这种情况下,您需要配置,如下所示:

@Value("${jdbc.driverClassName}")
private String driverClassName;

@Value("${jdbc.url}")
private String url;

@Value("${jdbc.user}")
private String username;

@Value("${jdbc.pass}")
private String password;

@Bean
public DataSource restDataSource(){
    final BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName(driverClassName);
    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    return dataSource;
}

@Bean
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholder() {
    return new PropertySourcesPlaceholderConfigurer();
}

“jdbc.driverClassName”是属性键,而不是类名。显然,这取决于您通过属性文件来解决它。“jdbc.driverClassName”是一个属性键,而不是类名。显然,这取决于您通过属性文件来解决它。谢谢。我对hibernate一无所知,所以我花了几个小时直到你帮我骗了你。我对冬眠一无所知,所以我花了几个小时直到你帮我