我正在尝试通过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");
}
};
}
}
我做错什么了?
30条答案
按热度按时间cuxqih2116#
首先删除所有配置,spring boot将为您启动它。
确保你有一个
application.properties
并添加以下属性。如果你真的需要访问
SessionFactory
这基本上是针对相同的数据源,然后您可以执行以下操作(这里也有文档记录,不过是针对xml,而不是javaconfig)。这样你就有了
EntityManagerFactory
和一个SessionFactory
.更新:从hibernate5开始
SessionFactory
实际上扩展了EntityManagerFactory
. 所以要得到一个SessionFactory
你可以简单地将EntityManagerFactory
或使用unwrap
方法获取一个。假设你有一个
main
方法@EnableAutoConfiguration
你不需要@EnableTransactionManagement
注解,因为SpringBoot将为您启用它。中的基本应用程序类com.spring.app
Package 应该够了。类似的东西应该足以检测到所有类(包括实体和基于spring数据的存储库)。
更新:这些注解可以替换为单个注解
@SpringBootApplication
在SpringBoot的最新版本中。我还建议你把
commons-dbcp
依赖性允许spring boot配置更快更健壮的HikariCP
实施。ozxc1zmp17#
我的问题是嵌入式数据库已经连接好了。密切联系
oxcyiej718#
确保你的pom里有你的数据库,就像op那样。那是我的问题。
velaa5lx19#
在我的例子中,用户无法连接到数据库。如果日志在异常之前包含警告,则if将出现相同问题:
elcex8rz20#
以下是造成这种情况的一些原因
hibernate.dialect
未设置问题。这些异常中的大多数都显示在启动日志中,最后是所提到的问题。示例:在带有postgres db的spring boot应用程序中
1. 检查数据库是否已实际安装,其服务器是否已启动。
org.postgresql.util.psqlexception:连接到localhost:5432 refused. 检查主机名和端口是否正确,以及邮局主管是否接受tcp/ip连接。
java.net.connectexception:连接被拒绝:连接
org.hibernate.service.spi.serviceexception:无法创建请求的服务[org.hibernate.engine.jdbc.env.spi.jdbcenvironment]
2. 检查是否正确提及数据库名称。
org.postgresql.util.psqlexception:致命:数据库“foo”不存在
在
application.properties
文件,但是
foo
根本不存在。所以我从pgadmin为postgres创建了数据库3. 检查主机名和服务器端口是否可访问。
org.postgresql.util.psqlexception:连接到localhost:5431 refused. 检查主机名和端口是否正确,以及邮局主管是否接受tcp/ip连接。
java.net.connectexception:连接被拒绝:连接
4. 检查数据库凭据是否正确。
正如@pankaj提到的
org.postgresql.util.psqlexception:致命:用户“postgres”的密码验证失败
spring.datasource.username= {DB USERNAME HERE}
spring.datasource.password= {DB PASSWORD HERE}
wz8daaqr21#
在springbootforjpajava配置中,您需要扩展jpabaseconfiguration并实现其抽象方法。
ix0qys7i22#
确保您的
application.properties
有所有正确的信息:(我改变了我的数据库端口从8889
至3306
成功了)9w11ddsr23#
这是因为您的代码无法连接数据库。确保你有mysql驱动程序和用户名,密码正确。
disbfnqx24#
删除冗余的休眠配置
如果您使用的是springboot,则不需要显式地提供jpa和hibernate配置,因为springboot可以为您做到这一点。
添加数据库配置属性
在
application.properties
在spring引导配置文件中,您可以添加数据库配置属性:添加特定于休眠的属性
同样地
application.properties
配置文件中,还可以设置自定义休眠属性:就这样!
sauutmhj25#
我也有同样的问题。将此添加到application.properties解决了问题:
o2g1uqev26#
我遇到了同样的问题,我的问题是我试图连接的数据库不存在。
我创建了数据库,验证了url/连接字符串,然后重新运行,一切正常。
eqzww0vc27#
我也面临着类似的问题。但是,这是因为提供的密码无效。另外,我想说您的代码似乎是使用spring的旧式代码。您已经提到您正在使用springboot,这意味着大多数东西都将为您自动配置。hibernate方言将根据类路径上可用的db驱动程序以及可用于正确测试连接的有效凭据自动选择。如果连接有任何问题,您将再次面临相同的错误。application.properties中只需要3个属性
gjmwrych28#
当我的数据库没有创建时,我遇到了这个错误。在手动创建db之后,它工作得很好。
hfwmuf9z29#
添加
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect
在application.properties文件中du7egjpx30#
在数据库服务器关闭的情况下启动应用程序(使用springboot)时,我也遇到了类似的问题。
hibernate可以自动确定要使用的正确方言,但是为了做到这一点,它需要一个到数据库的实时连接。