source

org.hibernate.최대 절전 모드예외:DialectResolution에 접근때 'hibernate.dialect'설정하지 않정보가 null이 될 수 없다.

goodcode 2022. 7. 31. 22:58
반응형

org.hibernate.최대 절전 모드예외:DialectResolution에 접근때 'hibernate.dialect'설정하지 않정보가 null이 될 수 없다.

나는 spring-jpa을 통해 겨울잠을 자다를 사용하는 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>

나의 겨울잠을 자다 배치가(그 사투리 구성이 지난 메서드에서 이 클래스에서) 있다.

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

나는 잘못된 여기서 뭐 하냐고?

우선 당신의 구성 봄은 부팅을 시작할 것이다를 제거한다.

다니세요.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그리고 그것이 근본적으로는 같은 datasource을 위한 것이다, 당신은 다음과 같은(또한 여기 비록 XML이 아니라 JavaConfig에 대한 문서가)을 할 수 있다.

@Configuration        
public class HibernateConfig {

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

해서 둘 다 수 요.EntityManagerFactory 「」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스프링 부츠com.spring.app패키지로 충분합니다.

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {


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

} 

이와 같은 기능은 모든 클래스(엔티티 및 Spring Data 기반 리포지토리 포함)를 탐지하기에 충분합니다.

업데이트: 이러한 주석은 단일 주석으로 대체할 수 있습니다.@SpringBootApplication스프링 부츠

@SpringBootApplication
public class Application {

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

,, 이, 이, 이, 이, 이, the, the, the, the, the, the, the, the, the, the, the, the, the the,commons-dbcp이를 통해 Spring Boot은 보다 빠르고 견고한 구현을 구성할 수 있습니다.

데이터베이스 서버가 다운된 상태에서 (Spring Boot을 사용하여) 어플리케이션을 기동할 때도 같은 문제가 있었습니다.

휴지 상태에서는, 자동적으로 사용하는 올바른 사투리를 판별할 수 있습니다만, 그러기 위해서는 데이타베이스에의 라이브 접속이 필요합니다.

spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect.properties file application.properties " " "

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

나도 비슷한 문제에 직면했다.하지만 잘못된 비밀번호가 제공되었기 때문입니다.또한 당신의 코드는 스프링을 사용한 구식 코드인 것 같습니다.이미 스프링 부트를 사용하고 있다고 말씀하셨습니다.즉, 대부분의 것이 자동으로 설정됩니다.hibernate 사투리는 classpath에서 사용할 수 있는 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/접속 문자열을 확인한 후 다시 실행해 보니 모든 것이 예상대로 작동했습니다.

다중 휴지 상태 설정 삭제

Spring Boot 를 사용하고 있는 경우는, 명시적으로 JPA 와 휴지 상태 설정을 지정할 필요는 없습니다.Spring Boot 에서는 이 설정을 실시할 수 있습니다.

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

서서 application.propertiesSpring Boot 컨피규레이션파일에는 데이터베이스 컨피규레이션속성을 추가할 수 있습니다.

spring.datasource.driverClassName = org.postgresql.Driver
spring.datasource.url = jdbc:postgresql://localhost:5432/teste
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

바로 그거야!

저도 같은 문제가 있었어요.이를 application.properties에 추가함으로써 문제가 해결되었습니다.

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

jpa java config 용 spring boot에서는 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");
    }

}

로는 다음과 .hibernate.dialect이치노이러한 예외의 대부분은, 기동 로그에 표시됩니다.기동 로그에는 최종적으로 전술한 문제가 계속됩니다.

예:Postgres DB를 사용한 봄 부팅 앱

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

  • org.postgresql.displays.displayPSQLException:localhost:5432로의 접속이 거부되었습니다.호스트명과 포토가 올바르고, 포스트 마스터가 TCP/IP 접속을 받아들이고 있는 것을 확인합니다.
  • java.net 를 참조해 주세요.Connect Exception:연결이 거부되었습니다: 연결
  • org.internate 를 선택합니다.service.spi.서비스 예외:요청된 서비스 [org.hibernate.eng.env.spi]를 생성할 수 없습니다.Jdbc 환경]

2. 데이터베이스명이 올바르게 기재되어 있는지 확인합니다.

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

    »application.properties 삭제,

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

    foo존재하지 않았다.에서 pgAdmin postgres의 .

    CREATE DATABASE foo;
    

3. 호스트 이름과 서버 포트에 액세스할 수 있는지 확인합니다.

  • org.postgresql.displays.displayPSQLException:localhost:5431로의 접속이 거부되었습니다.호스트명과 포토가 올바르고, 포스트 마스터가 TCP/IP 접속을 받아들이고 있는 것을 확인합니다.
  • java.net 를 참조해 주세요.Connect Exception:연결이 거부되었습니다: 연결

4. 데이터베이스 자격 증명이 올바른지 확인합니다.

  • @Pankaj가 말했듯이
  • org.postgresql.displays.displayPSQLException: FATAL: 사용자 "postgres" 비밀번호 인증 실패

    spring.datasource.username= {DB USERNAME HERE}

    spring.datasource.password= {DB PASSWORD HERE}

이것은 데이터베이스에 접속하기 위한 코드가 없기 때문에 발생합니다.mysql 드라이버와 사용자 이름, 비밀번호가 올바른지 확인합니다.

하세요.application.properties 있습니다. (db포트를 " 포트"를 "Db 포트"에서 했습니다). (db 포트)8889로로 합니다.3306★★★★★★★★★★★★★★★★★)

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

제 경우 사용자가 데이터베이스에 접속할 수 없었습니다.로그에 예외 직전에 경고가 포함되어 있는 경우,에 같은 문제가 발생하는 경우:

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

OP가 그랬던 것처럼 당신의 pom에 당신의 데이터베이스가 있는지 확인하세요.그건 내 문제였어.

문제는 임베디드 데이터베이스가 이미 연결되어 있다는 것이었습니다.밀접한 관계

이클립스가 JDBC 드라이버를 찾을 수 없을 때 이 문제가 발생하였습니다.이 일을 하기 위해 일식 때문에 그래들 리프레쉬를 해야 했어.

세트를 .spring.jpa.database=mysqlapplication.properties봄 JPA입니다.이것은 나에게 가장 간단한 대답이며 나는 이 질문에 대해 공유하고 싶다.

이 회선을 사용하고 있는 경우:

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

하다env.getProperty("hibernate.dialect")는 늘이 아닙니다.

동일하지만 JBoss WildFly AS에서.

의 내 my my my의 으로 해결.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>

AWS MySQL RDS를 사용하는 사용자의 경우 데이터베이스에 연결할 수 없을 때 발생할 수 있습니다.MySQL RDS에 대한 AWS Security Groups 설정으로 이동하고 MyIP를 새로 고쳐 인바운드 IP 규칙을 편집합니다.

저는 이 문제에 직면했고 위의 방법으로 문제를 해결했습니다.

저도 이런 문제가 있었어요.내 경우 MySQL 사용자에게 부여가 할당되지 않았기 때문입니다.앱에서 사용하는 MySQL 사용자에게 권한을 할당하면 다음과 같은 문제가 해결되었습니다.

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

같은 문제가 있었는데 디버깅을 해보니 Spring application.properties가 DB 서버의 IP 주소가 잘못되어 있음이 판명되었습니다.

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

" " " spring.jpa.database-platform=org.hibernate.dialect.MariaDB53Dialect내 소유물 파일에 저장해뒀어

추신: 마리아를 사용하고 있습니다.DB

이 에러 메세지는, 다음의 3개의 경우에 재현했습니다.

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

spring-boot app에서와 동일한 사용자 이름과 비밀번호를 가진 새 데이터베이스 사용자를 만들거나 기존 데이터베이스 사용자와 일치하도록 spring-boot app 파일에서 사용자 이름과 비밀번호를 변경하고 해당 데이터베이스 사용자에게 충분한 권한을 부여하는 것이 명백한 해결책입니다.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의 경우 이 오류 메시지가 이 세 가지 경우에 재현될 수 있는지 테스트하지 않았습니다.

같은 문제가 발생했는데 데이터베이스 인스턴스에 접속할 수 없기 때문에 발생하였습니다.위의 로그에서 휴지 상태 오류 HH000342를 찾습니다.이 에러에 의해, db 접속의 어디에 장해가 발생하고 있는지를 알 수 있습니다(잘못된 유저명/패스, URL 등).

이런 일이 일어난 건 제가 이 모든 걸지 않았기 때문이에요conf.configure();세션 시작 전:

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

application.properties에 올바른 세부 정보를 입력했는지 확인하고 데이터베이스 서버를 사용할 수 있는지 확인하십시오.예를 들어 MySQL을 사용하여 접속하는 경우 XAMPP가 정상적으로 실행되고 있는지 확인합니다.

저도 같은 문제에 직면했습니다.연결하려는 db가 존재하지 않습니다.나는 사용했다jpa.database=default(데이터베이스에 접속하여 자동으로 언어를 선택한다는 의미입니다).일단 데이터베이스를 시작하면, 아무런 변화 없이 정상적으로 작동했습니다.

Mysql 8.0.11 버전이 5.7로 복구되어 이 문제에 직면하게 되었습니다.

휴지 상태 코드 생성 사용 후 동일한 오류가 발생.

https://www.mkyong.com/hibernate/how-to-generate-code-with-hibernate-tools/

그 다음에hibernate.cfg.xml에 작성되었습니다./src/main/java삭제 후 접속 파라미터가 없어도 문제가 해결되었습니다.

언급URL : https://stackoverflow.com/questions/26548505/org-hibernate-hibernateexception-access-to-dialectresolutioninfo-cannot-be-null

반응형