org.hibernate.hibernateexception:未设置“hibernate.dialect”时,对方言解析信息的访问不能为空

uurity8g  于 2021-07-13  发布在  Java
关注(0)|答案(30)|浏览(407)

我正在尝试通过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");
         }
      };
   }
}

我做错什么了?

b4qexyjb

b4qexyjb1#

当eclipse无法找到jdbc驱动程序时,我遇到了这个问题。为了完成这项工作,我们必须在Eclipse中做一次渐变刷新。

vwoqyblh

vwoqyblh2#

在使用hibernate代码生成之后,我也遇到了同样的错误
https://www.mkyong.com/hibernate/how-to-generate-code-with-hibernate-tools/
然后 hibernate.cfg.xml 创建于 /src/main/java 但是没有连接参数后,删除它-我的问题解决了

0sgqnhkj

0sgqnhkj3#

我面临这个问题,因为mysql 8.0.11版本恢复到5.7为我解决了

wqnecbli

wqnecbli4#

我面临同样的问题:我试图连接的数据库不存在。我曾经 jpa.database=default (我猜这意味着它将尝试连接到数据库,然后自动选择方言)。一旦我启动了数据库,它运行良好,没有任何变化。

brjng4g3

brjng4g35#

请确保在application.properties中输入了有效的详细信息,以及数据库服务器是否可用。例如,当您连接mysql时,请检查xampp是否正常运行。

f87krz0w

f87krz0w6#

这发生在我身上,因为我没有添加 conf.configure(); 开始会话之前:

Configuration conf = new Configuration();
conf.configure();
kmpatx3s

kmpatx3s7#

我有同样的问题,这是由于无法连接到数据库示例。在该错误上面的日志中查找hibernate错误hh000342,它会让您知道数据库连接失败的位置(用户名/密码、url等不正确)

flseospp

flseospp8#

原来没有人提到布景 spring.jpa.database=mysqlapplication.properties 文件,如果您使用springjpa。这是对我最简单的回答,我想分享这个问题。

qni6mghb

qni6mghb9#

我在以下三种情况下复制了此错误消息:
不存在用户名写在application.properties文件或persistence.properties文件或hibernateconfig文件中的数据库用户
部署的数据库中有该用户,但该用户使用的密码与上述文件中的密码不同
数据库拥有与该用户和密码匹配的用户,但该用户没有完成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是否可以在这三种情况下重现此错误消息。

u59ebvdq

u59ebvdq10#

添加 spring.jpa.database-platform=org.hibernate.dialect.MariaDB53Dialect 我的财产档案对我有用。
ps:我在用mariadb

6mzjoqzu

6mzjoqzu11#

我也遇到了同样的问题,调试后发现spring application.properties的db server ip地址错误

spring.datasource.url=jdbc:oracle:thin:@WRONG:1521/DEV
wsxa1bj1

wsxa1bj112#

我也有这个问题。在我的例子中,这是因为没有授予mysql用户权限。将授权分配给我的应用程序使用的mysql用户解决了以下问题:

grant select, insert, delete, update on my_db.* to 'my_user'@'%';
2j4z5cfb

2j4z5cfb13#

对于那些使用aws-mysql-rds的用户,当您无法连接到数据库时可能会发生这种情况。转到aws security groups setting for mysql rds,通过刷新myip来编辑入站ip规则。
我面对这个问题,做上述得到的问题为我解决。

v09wglhw

v09wglhw14#

与jboss wildfly相同。
解决了我的问题 META-INF/persistence.xml ```




uttx8gqw

uttx8gqw15#

如果您使用这条线:

sessionFactory.getHibernateProperties().put("hibernate.dialect", env.getProperty("hibernate.dialect"));

确保 env.getProperty("hibernate.dialect") 不为空。

相关问题