我试图通过spring-jpa运行一个使用hibernate的spring-boot应用程序,但我得到这个错误:
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:104)
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:71)
at org.hibernate.engine.jdbc.internal.JdbcServicesImpl.configure(JdbcServicesImpl.java:205)
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.configureService(StandardServiceRegistryImpl.java:111)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:234)
at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:206)
at org.hibernate.cfg.Configuration.buildTypeRegistrations(Configuration.java:1885)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1843)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843)
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398)
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842)
at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:152)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:336)
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1613)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1550)
... 21 more
我的pom.xml文件是这样的:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.1.8.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-taglibs</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
</dependency>
</dependencies>
我的hibernate配置是这样的(方言配置在该类的最后一个方法中):
@Configuration
@EnableTransactionManagement
@ComponentScan({ "com.spring.app" })
public class HibernateConfig {
@Bean
public LocalSessionFactoryBean sessionFactory() {
LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean();
sessionFactory.setDataSource(restDataSource());
sessionFactory.setPackagesToScan(new String[] { "com.spring.app.model" });
sessionFactory.setHibernateProperties(hibernateProperties());
return sessionFactory;
}
@Bean
public DataSource restDataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("org.postgresql.Driver");
dataSource.setUrl("jdbc:postgresql://localhost:5432/teste?charSet=LATIN1");
dataSource.setUsername("klebermo");
dataSource.setPassword("123");
return dataSource;
}
@Bean
@Autowired
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory);
return txManager;
}
@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
return new PersistenceExceptionTranslationPostProcessor();
}
Properties hibernateProperties() {
return new Properties() {
/**
*
*/
private static final long serialVersionUID = 1L;
{
setProperty("hibernate.hbm2ddl.auto", "create");
setProperty("hibernate.show_sql", "false");
setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
}
};
}
}
我哪里做错了?
首先删除所有配置,Spring Boot将为您启动它。
确保你有申请。属性,并添加以下属性。
spring.datasource.url=jdbc:postgresql://localhost:5432/teste?charSet=LATIN1
spring.datasource.username=klebermo
spring.datasource.password=123
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.show-sql=false
spring.jpa.hibernate.ddl-auto=create
如果您确实需要访问SessionFactory,并且基本上是针对同一个数据源,那么您可以执行以下操作(这里也记录了这一点,但针对的是XML,而不是JavaConfig)。
@Configuration
public class HibernateConfig {
@Bean
public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) {
HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
factory.setEntityManagerFactory(emf);
return factory;
}
}
这样你就有了一个EntityManagerFactory和一个SessionFactory。
更新:从Hibernate 5开始,SessionFactory实际上扩展了EntityManagerFactory。因此,要获得一个SessionFactory,你可以简单地将EntityManagerFactory转换到它或使用unwrap方法来获得一个。
public class SomeHibernateRepository {
@PersistenceUnit
private EntityManagerFactory emf;
protected SessionFactory getSessionFactory() {
return emf.unwrap(SessionFactory.class);
}
}
假设您有一个带有@EnableAutoConfiguration的主方法的类,您不需要@EnableTransactionManagement注释,因为它将由Spring Boot为您启用。app包中的一个基本应用程序类就足够了。
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
这样就足以检测到所有的类(包括实体和基于Spring Data的存储库)。
更新:在SpringBoot的最新版本中,这些注释可以用一个@SpringBootApplication代替。
@SpringBootApplication
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
我还建议删除commons-dbcp依赖项,因为这将允许Spring Boot配置更快、更健壮的HikariCP实现。
I also faced a similar issue. But, it was due to the invalid password provided. Also, I would like to say your code seems to be old-style code using spring. You already mentioned that you are using spring boot, which means most of the things will be auto configured for you. hibernate dialect will be auto selected based on the DB driver available on the classpath along with valid credentials which can be used to test the connection properly. If there is any issue with the connection you will again face the same error. only 3 properties needed in application.properties
# Replace with your connection string
spring.datasource.url=jdbc:mysql://localhost:3306/pdb1
# Replace with your credentials
spring.datasource.username=root
spring.datasource.password=
以下是休眠的一些原因。方言不设问题。
大多数这些异常都显示在启动日志中,最终会出现上述问题。
示例:在Spring引导应用程序中使用Postgres DB
1. 检查数据库是否已经安装,数据库服务器是否已经启动。
org.postgresql.util.PSQLException: Connection to localhost:5432 refused。检查主机名和端口是否正确,以及邮政管理员是否接受TCP/IP连接。
connectexception:连接拒绝:连接
org.hibernate.service.spi.ServiceException:无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]
2. 检查数据库名称是否正确。
org.postgresql.util.PSQLException: FATAL:数据库“foo”不存在
在应用程序中。属性文件,
Spring.datasource.url = jdbc:postgresql://localhost:5432/foo
但是foo并不存在。
因此,我从pgAdmin为postgres创建了数据库
创建数据库foo
3.检查主机名和服务器端口是否可访问。
org.postgresql.util.PSQLException: Connection to localhost:5431 refused。检查主机名和端口是否正确,以及邮政管理员是否接受TCP/IP连接。
connectexception:连接拒绝:连接
4. 检查数据库凭证是否正确。
正如@Pankaj提到的
org.postgresql.util.PSQLException: FATAL: password authentication failed for user "postgres"
spring.datasource。用户名={此处为数据库用户名}
spring.datasource。密码={数据库密码}
删除冗余的Hibernate配置
如果您正在使用Spring Boot,则不需要显式地提供JPA和Hibernate配置,因为Spring Boot可以为您提供这些配置。
添加数据库配置属性
在应用程序中。Spring Boot配置文件,你有添加你的数据库配置属性:
spring.datasource.driverClassName = org.postgresql.Driver
spring.datasource.url = jdbc:postgresql://localhost:5432/teste
spring.datasource.username = klebermo
spring.datasource.password = 123
添加Hibernate特定的属性
在同一个应用程序中。属性配置文件,你也可以设置自定义Hibernate属性:
# Log SQL statements
spring.jpa.show-sql = false
# Hibernate ddl auto for generating the database schema
spring.jpa.hibernate.ddl-auto = create
# Hibernate database Dialect
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
就是这样!
我在以下三种情况下复制了此错误消息:
应用程序中不存在用户名的数据库用户。属性文件或持久性。属性文件,或者在hibernate econfig文件中
部署的数据库拥有该用户,但用户的密码与上述文件中的密码不同
数据库具有该用户和密码匹配,但该用户不具有完成spring-boot应用程序所执行的所有数据库任务所需的所有权限
显而易见的解决方案是创建新的数据库用户,使用与spring-boot应用程序中的用户名和密码相同的用户名和密码,或者更改spring-boot应用程序文件中的用户名和密码,以匹配现有的数据库用户,并授予该数据库用户足够的权限。在MySQL数据库的情况下,这可以做到如下所示:
mysql -u root -p
>CREATE USER 'theuser'@'localhost' IDENTIFIED BY 'thepassword';
>GRANT ALL ON *.* to theuser@localhost IDENTIFIED BY 'thepassword';
>FLUSH PRIVILEGES;
显然,在Postgresql中也有类似的命令,但我还没有测试在Postgresql中,这个错误消息是否可以在这三种情况下重现。
作为一个更描述性的答案
修复连接数据库相关的问题:
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.determineDialect(DialectFactoryImpl.java:100) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
at org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl.buildDialect(DialectFactoryImpl.java:54) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:137) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
at org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator.initiateService(JdbcEnvironmentInitiator.java:35) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:101) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:263) ~[hibernate-core-5.4.8.Final.jar:5.4.8.Final]
... 38 common frames omitted
你需要做的是:
要选择与所需数据库(您在应用程序中使用的数据库)相关的特定数据源配置选项。属性文件),例如:spring.datasource.platform=postgres:
为了避免在连接时提示“FATAL: database "testDb" does not exist”:
使用PgAdmin需要手动创建数据库(如果您使用的是PostgreSQL开发平台):
基于应用程序内部的属性。属性文件:
spring.datasource.url=jdbc:postgresql://localhost:5432/testDb
配置剩余设置:
spring.datasource.url = jdbc: postgresql: / / localhost: 5432 / testDb
spring.datasource.username = postgres
spring.datasource.password = your_password
根据你的应用。属性文件:
点击“测试连接”和“应用”。