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

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

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



답변

먼저 모든 구성을 제거하십시오. 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구현 을 구성 할 수 있도록 종속성을 제거하는 것이 좋습니다 .


답변

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

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


답변

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


답변

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


답변

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


답변

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

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


답변

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