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

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

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

我做错什么了?

cuxqih21

cuxqih2116#

首先删除所有配置,spring boot将为您启动它。
确保你有一个 application.properties 并添加以下属性。

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 .
更新:从hibernate5开始 SessionFactory 实际上扩展了 EntityManagerFactory . 所以要得到一个 SessionFactory 你可以简单地将 EntityManagerFactory 或使用 unwrap 方法获取一个。

public class SomeHibernateRepository {

  @PersistenceUnit
  private EntityManagerFactory emf;

  protected SessionFactory getSessionFactory() {
    return emf.unwrap(SessionFactory.class);
  }

}

假设你有一个 main 方法 @EnableAutoConfiguration 你不需要 @EnableTransactionManagement 注解,因为SpringBoot将为您启用它。中的基本应用程序类 com.spring.app Package 应该够了。

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }

}

类似的东西应该足以检测到所有类(包括实体和基于spring数据的存储库)。
更新:这些注解可以替换为单个注解 @SpringBootApplication 在SpringBoot的最新版本中。

@SpringBootApplication
public class Application {

    public static void main(String[] args) throws Exception {
        SpringApplication.run(Application.class, args);
    }
}

我还建议你把 commons-dbcp 依赖性允许spring boot配置更快更健壮的 HikariCP 实施。

ozxc1zmp

ozxc1zmp17#

我的问题是嵌入式数据库已经连接好了。密切联系

oxcyiej7

oxcyiej718#

确保你的pom里有你的数据库,就像op那样。那是我的问题。

velaa5lx

velaa5lx19#

在我的例子中,用户无法连接到数据库。如果日志在异常之前包含警告,则if将出现相同问题:

WARN HHH000342: Could not obtain connection to query metadata : Login failed for user 'my_user'.
elcex8rz

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 文件,

spring.datasource.url = jdbc:postgresql://localhost:5432/foo

但是 foo 根本不存在。所以我从pgadmin为postgres创建了数据库

CREATE DATABASE foo;

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}

wz8daaqr

wz8daaqr21#

在springbootforjpajava配置中,您需要扩展jpabaseconfiguration并实现其抽象方法。

@Configuration
public class JpaConfig extends JpaBaseConfiguration {

    @Override
    protected AbstractJpaVendorAdapter createJpaVendorAdapter() {
        final HibernateJpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        return vendorAdapter;
    }

    @Override
    protected Map<String, Object> getVendorProperties() {
        Map<String, Object> properties = new HashMap<>();
        properties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQLDialect");
    }

}
ix0qys7i

ix0qys7i22#

确保您的 application.properties 有所有正确的信息:(我改变了我的数据库端口从 88893306 成功了)

db.url: jdbc:mysql://localhost:3306/test
9w11ddsr

9w11ddsr23#

这是因为您的代码无法连接数据库。确保你有mysql驱动程序和用户名,密码正确。

disbfnqx

disbfnqx24#

删除冗余的休眠配置

如果您使用的是springboot,则不需要显式地提供jpa和hibernate配置,因为springboot可以为您做到这一点。

添加数据库配置属性

application.properties 在spring引导配置文件中,您可以添加数据库配置属性:

spring.datasource.driverClassName = "org.postgresql.Driver
spring.datasource.url = jdbc:postgresql://localhost:5432/teste?charSet=LATIN1
spring.datasource.username = klebermo
spring.datasource.password = 123

添加特定于休眠的属性

同样地 application.properties 配置文件中,还可以设置自定义休眠属性:


# 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

就这样!

sauutmhj

sauutmhj25#

我也有同样的问题。将此添加到application.properties解决了问题:

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
o2g1uqev

o2g1uqev26#

我遇到了同样的问题,我的问题是我试图连接的数据库不存在。
我创建了数据库,验证了url/连接字符串,然后重新运行,一切正常。

eqzww0vc

eqzww0vc27#

我也面临着类似的问题。但是,这是因为提供的密码无效。另外,我想说您的代码似乎是使用spring的旧式代码。您已经提到您正在使用springboot,这意味着大多数东西都将为您自动配置。hibernate方言将根据类路径上可用的db驱动程序以及可用于正确测试连接的有效凭据自动选择。如果连接有任何问题,您将再次面临相同的错误。application.properties中只需要3个属性


# Replace with your connection string

spring.datasource.url=jdbc:mysql://localhost:3306/pdb1

# Replace with your credentials

spring.datasource.username=root
spring.datasource.password=
gjmwrych

gjmwrych28#

当我的数据库没有创建时,我遇到了这个错误。在手动创建db之后,它工作得很好。

hfwmuf9z

hfwmuf9z29#

添加 spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect 在application.properties文件中

du7egjpx

du7egjpx30#

在数据库服务器关闭的情况下启动应用程序(使用springboot)时,我也遇到了类似的问题。
hibernate可以自动确定要使用的正确方言,但是为了做到这一点,它需要一个到数据库的实时连接。

相关问题