org.hibernate.HibernateException : 'hibernate.dialect'가 설정되지 않은 경우 DialectResolutionInfo에 대한 액세스가 널이 될 수 없습니다


205

spring-jpa를 통해 최대 절전 모드를 사용하는 스프링 부트 응용 프로그램을 실행하려고하지만이 오류가 발생합니다.

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>

내 동면 구성은 다음과 같습니다 (방언 구성은이 클래스의 마지막 방법입니다).

@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");
         }
      };
   }
}

내가 여기서 뭘 잘못하고 있니?

답변:


199

먼저 모든 구성을 제거하십시오. 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

a에 대한 액세스가 필요 SessionFactory하고 기본적으로 동일한 데이터 소스에 대한 것이라면 다음을 수행 할 수 있습니다 ( JavaConfig가 아닌 XML 에도 여기에 설명 되어 있음).

@Configuration        
public class HibernateConfig {

    @Bean
    public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) {
         HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
         factory.setEntityManagerFactory(emf);
         return factory;
    }
}

그렇게하면 EntityManagerFactorya와 a 가 둘 다 SessionFactory있습니다.

업데이트 : 최대 절전 모드 5부터 SessionFactory실제로 확장됩니다 EntityManagerFactory. 따라서를 얻으려면에 SessionFactory캐스팅 EntityManagerFactory하거나 unwrap메소드를 사용하여 얻을 수 있습니다.

public class SomeHibernateRepository {

  @PersistenceUnit
  private EntityManagerFactory emf;

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

}

main메소드 가있는 클래스가 있다고 가정하면 주석이 @EnableAutoConfiguration필요하지 않습니다 @EnableTransactionManagement. 이는 Spring Boot에서 활성화됩니다. com.spring.app패키지 의 기본 응용 프로그램 클래스 이면 충분합니다.

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {


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

} 

이와 같은 것은 모든 클래스 (엔티티 및 스프링 데이터 기반 리포지토리 포함)를 감지하기에 충분해야합니다.

업데이트 : 이러한 주석은 @SpringBootApplication최신 버전의 Spring Boot에서 단일로 대체 할 수 있습니다 .

@SpringBootApplication
public class Application {

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

commons-dbcp스프링 부트가 더 빠르고 강력한 HikariCP구현 을 구성 할 수 있도록 종속성을 제거하는 것이 좋습니다 .


1
그러나이 파일을 만들지 않는 방법이 application.propertes있습니까? 클래스 HibernateConfig에서 모든 구성을 수행하는 방법을 선호합니다.
Kleber Mota

2
왜? Spring Boot의 전체 목적은 자동 구성을 수행하는 것입니다 ... 그래서 속성 파일에 7 줄 이상의 상세한 Java 구성을 포함시키는 것을 선호합니까?!
M. Deinum

2
속성 파일에는 6 줄이 될 수도 있습니다. Boot가 post.s를 사용하여 spring.datasource.url에서 유추 할 때 spring.datasource.driverClassName을 설정할 필요가 없습니다.
Andy Wilkinson

2
@AlexWorden 아니요 그렇지 않습니다 ... 임의의 주석을 넣는 대신, 특히 Spring Boot가 지원하는 속성이 어떻게로드되는지 읽는 것이 좋습니다. 파일 권한을 바로 설정하면 디스크의 비밀번호는 문제가되지 않습니다. 그것들을 데이터베이스에 넣는 것이 낫지는 않다 ...
M. Deinum

4
Configuration, EnableAutoConfiguration, ComponentScan 등 3 개의 주석을 사용하는 대신. SpringBootApplication 주석을 사용할 수 있습니다
Pankaj

158

데이터베이스 서버가 다운 된 상태 에서 응용 프로그램을 시작할 때 (Spring Boot 사용) 비슷한 문제가 발생 했습니다 .

최대 절전 모드는 자동으로 사용할 올바른 방언을 결정할 수 있지만 이렇게하려면 데이터베이스에 실시간으로 연결해야합니다.


2
내 문제는 서버의 pg_hba.conf가 원격 연결을 위해 구성되지 않았다는 점에서 이와 비슷합니다.이 오류가 발생했습니다.
Brian

8
연결하려는 데이터베이스가 존재하지 않으면이 오류도 표시됩니다.
조나스 페데르센

12
내 경우에는 DB가 작동했지만 자격 증명이 잘못되었습니다. +1
Federico Piazza

놀랍게도 hbm2ddl.auto = true가 db 및 테이블을 생성 할 것으로 예상되는 스키마를 삭제할 때이 문제가 발생하기 시작했습니다. 그러나 실패했다. 하지만 빈 스키마를 만들었습니다. hbm2ddl은 테이블 생성 작업을 수행했습니다.
Saurabh

데이터베이스 머신의 IP가 변경되었지만 DNS가 기존의 것으로 변경되었습니다 :-(
Illidan

24

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialectapplication.properties 파일에 추가


이것은 훌륭한 답변입니다-데이터베이스 클래스에 MockBean을 사용할 수 있고 속성 프로파일에 실제 연결 정보가 없습니다
Taylor

spring.jpa.properties.hibernate.dialect를 application.properties에 추가하면 도움이되었습니다. 감사합니다)
Maks

22

데이터베이스가 생성되지 않았을 때이 오류가 발생했습니다. DB를 수동으로 만든 후에는 정상적으로 작동했습니다.


1
일반적으로 "spring.jpa.hibernate.ddl-auto = create"를 사용하여 수동 생성을 피할 수 있습니다.
Andrei

@Andrei- "spring.jpa.hibernate.ddl-auto = create"를 어떻게 / 어디서 지정합니까?
Alex Worden

2
@AlexWorden, Andrei는 Spring Boot 인 경우 application.properties에 넣을 수 있음을 의미했습니다. xml 기반 Spring 구성에 해당하는 항목이 있어야합니다.
ACV

이 오류는 데이터베이스가 존재하지 않거나 데이터베이스 내부의 테이블이 없을 때만 나타 납니까?
zygimantus

1
비밀번호가 잘못되어 같은 오류가 발생했습니다. ACV 감사합니다. 많은 도움을 주셨습니다.
santu

17

나는 비슷한 문제에 직면했다. 그러나 잘못된 비밀번호가 제공 되었기 때문입니다. 또한, 귀하의 코드는 스프링을 사용하는 구식 코드 인 것 같습니다. 이미 스프링 부트를 사용하고 있다고 언급했는데 이는 대부분의 항목이 자동으로 구성됨을 의미합니다. 연결을 올바르게 테스트하는 데 사용할 수있는 유효한 자격 증명과 함께 클래스 경로에서 사용 가능한 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=

8

나는 같은 문제에 부딪 쳤고 연결하려는 DB가 존재하지 않는다는 것이 문제였습니다.

DB를 만들고 URL / 연결 문자열을 확인한 후 다시 실행하면 모든 것이 예상대로 작동했습니다.


고맙다는 의견으로 연결 포트를 잘못 확인했습니다.
Feras

4

데이터베이스에 연결하는 데 코드가 베일이 아니기 때문에 이런 일이 발생합니다. mysql 드라이버와 사용자 이름, 비밀번호가 올바른지 확인하십시오.


4

귀하의 application.properties정보가 모두 올바른지 확인하십시오 : (DB 포트를 작동 8889하도록 변경 3306했습니다)

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

4

jpa java config의 스프링 부트에서는 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");
    }

}

경우에 따라 application.properties가 속성 변경 사항을 볼 수 없습니다. 위와 같이 properties.put을 추가하고 정상적으로 작동했습니다.
fatih yavuz

4

중복 최대 절전 모드 구성 제거

Spring Boot를 사용하는 경우 Spring Boot가 대신 할 수 있으므로 JPA 및 최대 절전 모드 구성을 명시 적으로 제공 할 필요가 없습니다.

데이터베이스 구성 특성 추가

에서 application.properties봄 부팅 구성 파일, 당신은 당신의 데이터베이스 구성 속성을 추가 있습니다 :

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

그게 다야!


spring.jpa.properties.hibernate.dialect를 application.properties에 추가하면 도움이되었습니다. 감사합니다)
Maks

3

나는 같은 문제가 있었다. 이것을 application.properties에 추가하면 문제가 해결되었습니다.

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

spring.jpa.properties.hibernate.dialect를 application.properties에 추가하면 도움이되었습니다. 감사합니다)
Maks

2

제 경우에는 사용자가 데이터베이스에 연결할 수 없습니다. 로그에 예외 직전에 경고가 포함 된 경우 동일한 문제가 발생하는 경우 :

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

2

OP처럼 데이터베이스를 pom에 저장하십시오. 그게 내 문제 야


더 자세히 설명해 주시겠습니까? 이 답변의 의미는 무엇입니까?
Tunaki

방금 mysql 의존성을 추가해야했습니다.
obesechicken13

2

내 문제는 임베디드 데이터베이스가 이미 연결되어 있다는 것입니다. 연결을 닫습니다


1
연결에 실패하면이 오류를보고하는 최대 절전 모드 문제가 있음을 확인할 수 있습니다. 네트워크를 켜고 끄는 문제를 재현 할 수 있습니다.
borjab

2

Eclipse가 JDBC 드라이버를 찾을 수 없을 때이 문제가 발생했습니다. 이 작품을 얻으려면 일식에서 gradle refresh를 수행해야했습니다.


2

다음은 hibernate.dialect설정되지 않은 문제 의 일부 이유입니다 . 이러한 예외의 대부분은 시작 로그에 표시되며 마지막에 언급 된 문제가 따릅니다.

예 : Postgres DB가 포함 된 Spring 부팅 앱

1. 데이터베이스가 실제로 설치되어 있고 해당 서버가 시작되었는지 확인하십시오.

  • org.postgresql.util.PSQLException : localhost : 5432에 대한 연결이 거부되었습니다. 호스트 이름과 포트가 올 바르고 포스트 마스터가 TCP / IP 연결을 승인하는지 확인하십시오.
  • java.net.ConnectException : 연결 거부 : 연결
  • org.hibernate.service.spi.ServiceException : 요청 된 서비스를 작성할 수 없음 [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

2. 데이터베이스 이름이 올바르게 언급되어 있는지 확인하십시오.

  • org.postgresql.util.PSQLException : FATAL : 데이터베이스 "foo"가 존재하지 않습니다

    에서 application.properties파일,

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

    그러나 foo존재하지 않았습니다. postgres를 위해 pgAdmin에서 데이터베이스를 만들었습니다.

    CREATE DATABASE foo;

3. 호스트 이름과 서버 포트에 액세스 할 수 있는지 확인하십시오.

  • org.postgresql.util.PSQLException : localhost : 5431에 대한 연결이 거부되었습니다. 호스트 이름과 포트가 올 바르고 포스트 마스터가 TCP / IP 연결을 승인하는지 확인하십시오.
  • java.net.ConnectException : 연결 거부 : 연결

4. 데이터베이스 신임 정보가 올바른지 확인하십시오.

  • @Pankaj가 언급했듯이
  • org.postgresql.util.PSQLException : FATAL : "postgres"사용자의 비밀번호 인증에 실패했습니다

    spring.datasource.username= {DB USERNAME HERE}

    spring.datasource.password= {DB PASSWORD HERE}


1

이 줄을 사용하는 경우 :

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

env.getProperty("hibernate.dialect")그것이 널이 아닌지 확인하십시오 .


1

JBoss WildFly AS 와 동일합니다 .

내 속성으로 해결 META-INF/persistence.xml

<properties>
            <property name="hibernate.transaction.jta.platform"
                value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" />
            <property name="spring.jpa.database-platform" value="org.hibernate.dialect.PostgreSQLDialect" />
            <property name="spring.jpa.show-sql" value="false" />
</properties>

1

AWS MySQL RDS로 작업하는 사람들은 데이터베이스에 연결할 수 없을 때 발생할 수 있습니다. MySQL RDS에 대한 AWS 보안 그룹 설정으로 이동하고 MyIP를 새로 고쳐 인바운드 IP 규칙을 편집하십시오.

나는이 문제에 직면하여 위의 작업을 수행하면 문제가 해결되었습니다.


RDS Aurora MySQL의 보안 그룹에 대한 모든 트래픽을 허용했습니다. 보다 구체적이거나 생산적인 환경을 원한다면 허용 된 IP 만 추가하십시오
AleksandarT

1

나는 또한이 문제가 있었다. 필자의 경우 MySQL 사용자에게 부여 된 권한이 없기 때문입니다. 내 앱에서 사용하는 MySQL 사용자에게 부여를 할당하면 문제가 해결되었습니다.

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

1

나는 같은 문제가 있었고 디버깅 후 Spring application.properties에 DB 서버에 대한 잘못된 IP 주소가 있음이 밝혀졌습니다

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

1

이 오류 메시지는 다음 세 가지 경우에 재현했습니다.

  • application.properties 파일 또는 persistence.properties 파일 또는 사용자의 경우와 같이 HibernateConfig 파일에 작성된 사용자 이름을 가진 데이터베이스 사용자가 없습니다.
  • 배포 된 데이터베이스에는 해당 사용자가 있지만 사용자는 위 파일 중 하나와 다른 비밀번호로 식별됩니다.
  • 데이터베이스에는 해당 사용자와 암호가 일치하지만 스프링 부트 앱이 수행하는 모든 데이터베이스 작업을 수행하는 데 필요한 모든 권한이 없습니다

확실한 해결책은 스프링 부트 앱에서와 동일한 사용자 이름 및 비밀번호로 새 데이터베이스 사용자를 작성하거나 기존 데이터베이스 사용자와 일치하도록 스프링 부트 앱 파일에서 사용자 이름 및 비밀번호를 변경하고 해당 데이터베이스 사용자에게 충분한 권한을 부여하는 것입니다. 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의 경우이 세 가지 경우 에이 오류 메시지를 재현 할 수 있는지 테스트하지 않았습니다.


0

나는 같은 문제가 있었고 데이터베이스 인스턴스에 연결할 수 없기 때문에 발생했습니다. 해당 오류 위의 로그에서 최대 절전 모드 오류 HHH000342를 찾으십시오 .DB 연결이 실패한 위치에 대한 아이디어를 제공해야합니다 (잘못된 사용자 이름 / 패스, URL 등).


0

conf.configure();세션을 시작하기 전에 추가하지 않았기 때문에 이런 일이 일어났습니다 .

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

0

application.properties에 올바른 세부 사항을 입력 했는지와 데이터베이스 서버가 사용 가능한지 확인하십시오. 예를 들어 MySQL에 연결할 때 XAMPP 가 제대로 실행되고 있는지 확인하십시오.


0

나는 같은 문제에 직면했다 : 내가 연결하려고하는 db가 존재하지 않았다. 나는 사용했다 jpa.database=default(나는 데이터베이스에 연결하고 자동으로 방언을 선택하려고 시도한다는 것을 의미한다). 데이터베이스를 시작하면 아무런 변화없이 정상적으로 작동했습니다.





0

나는 같은 오류가 있었다.

 Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

필자의 경우 WAR에는 application.properties
가 외부 application.properties가 올바른 DB 서버를 가리키는 개발 서버를 가리키는 내부에있었습니다 .

classpath / jars에 다른 application.properties가 없는지 확인하십시오 ...

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.