it-swarm-es.tech

org.hibernate.HibernateException: el acceso a DialectResolutionInfo no puede ser nulo cuando no se encuentra 'hibernate.dialect'

Estoy intentando ejecutar una aplicación Spring-Boot que usa hibernar a través de spring-jpa, pero recibo este error:

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

mi archivo pom.xml es este:

<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>

mi configuración de hibernación es que (la configuración de dialecto está en el último método de esta clase):

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

¿Qué estoy haciendo mal aquí?

149
Kleber Mota

Primero elimine toda su configuración. Spring Boot la iniciará por usted. Si realmente necesita una SessionFactory en lugar de una EntityManagerFactory agregue una HibernateJpaSessionFactoryBean.

Asegúrese de tener un application.properties en su classpath y agregue las siguientes propiedades.

spring.datasource.driverClassName=org.postgresql.Driver
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

Si realmente necesita acceder a una SessionFactory y eso es básicamente para la misma fuente de datos, entonces puede hacer lo siguiente (que también está documentado aquí aunque para XML, no JavaConfig).

@Configuration        
public class HibernateConfig {

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

De esa manera tienes tanto una EntityManagerFactory y una SessionFactory.

Suponiendo que tiene una clase con un método main con @EnableAutoConfiguration, no necesita la anotación @EnableTransactionManagement, ya que Spring Boot la habilitará para usted. Una clase de aplicación básica en el paquete com.spring.app debería ser suficiente.

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {


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

} 

Algo así debería ser suficiente para que se detecten todas sus clases (incluidas las entidades y los repositorios basados ​​en Spring Data).

También sugeriría eliminar la dependencia commons-dbcp, ya que eso permitiría a Spring Boot configurar la más rápida y robusta HikariCP implementación.

156
M. Deinum

Me enfrenté a un problema similar al iniciar la aplicación (usando Spring Boot) con el servidor de base de datos inactivo .

Hibernate puede determinar el dialecto correcto para usar automáticamente, pero para hacer esto, necesita una conexión en vivo a la base de datos.

115
mhnagaoka

Recibí este error cuando mi base de datos no fue creada. Después de crear el DB manualmente, funcionó bien.

18
ACV

También me enfrenté a un problema similar. Pero, fue debido a la contraseña no válida proporcionada. Además, me gustaría decir que su código parece ser un código de estilo antiguo con Spring. Ya mencionó que está utilizando Spring Boot, lo que significa que la mayoría de las cosas se configurarán automáticamente para usted. El dialecto de hibernación se seleccionará automáticamente en función del controlador de base de datos disponible en la ruta de clase junto con las credenciales válidas que se pueden usar para probar la conexión correctamente. Si hay algún problema con la conexión, volverá a enfrentar el mismo error. solo 3 propiedades necesarias en application.properties

# Replace with your connection string
spring.datasource.url=jdbc:mysql://localhost:3306/pdb1

# Replace with your credentials
spring.datasource.username=root
spring.datasource.password=
14
Pankaj

agregar spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect en el archivo application.properties

13
alpine

Me encontré con el mismo problema y mi problema era que la base de datos a la que intentaba conectarme no existía.

Creé la base de datos, verifiqué la URL/cadena de conexión y la repetición y todo funcionó como se esperaba.

6
Eric B.

Asegúrese de que su application.properties tenga toda la información correcta: (Cambié mi puerto de base de datos de 8889 a 3306 funcionó)

 db.url: jdbc:mysql://localhost:3306/test
3
Vikram S

esto sucede porque su código no puede conectar la base de datos. Asegúrese de que tiene el controlador mysql y el nombre de usuario, contraseña correcta.

3
user7169604

Asegúrese de tener su base de datos en su pom como lo hizo OP. Ese fue mi problema.

2
obesechicken13

En Spring Boot para jpa Java config, necesita extender JpaBaseConfiguration e implementar sus métodos abstractos.

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

}
2
Yaroslav

En mi caso el usuario no pudo conectarse a la base de datos. Si tendrá el mismo problema si el registro contiene una advertencia justo antes de la excepción:

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

Mi problema era que la base de datos integrada ya estaba conectada. conexión cercana

2
doesnt_matter

Tengo este problema cuando Eclipse no pudo encontrar el controlador JDBC. Tuve que hacer una actualización de gradle desde el Eclipse para obtener este trabajo.

1
Kannan Ramamoorthy

Yo también tuve este problema. En mi caso fue porque no se asignaron subvenciones al usuario de MySQL. La asignación de subvenciones al usuario de MySQL que utiliza mi aplicación resolvió el problema:

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

Esto me sucedió porque no había agregado conf.configure(); antes de comenzar la sesión:

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

Me enfrenté al mismo problema: el db que estaba tratando de conectar no existía. Utilicé jpa.database=default (lo que supongo significa que intentará conectarse a la base de datos y luego seleccionar automáticamente el dialecto). Una vez que comencé la base de datos, funcionó bien sin ningún cambio.

0
Avishekh Tewari

Si el error anterior en el registro fue el siguiente: "ERROR - HikariPool-1 - jdbcUrl se requiere con driverClassName", entonces la solución es volver a escribir "url" en "jdbc-url" de acuerdo con esto: Database application.yml para Spring boot de applications.properties

0
JanBrus

Tuve el mismo error después de usar la generación de código de hibernación

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

luego se creó hibernate.cfg.xml en /src/main/Java pero sin los parámetros de conexión después de eliminarlo, mi problema se resolvió

0
RMagen

Tuve el mismo problema y fue causado por no poder conectar con la instancia de la base de datos. Busque el error de hibernación HHH000342 en el registro que se encuentra sobre ese error, debería darle una idea de dónde está fallando la conexión de la base de datos (nombre de usuario/contraseña incorrectos, url, etc.)

0
Farouk

Para aquellos que trabajan con AWS MySQL RDS, puede ocurrir cuando no puede conectarse a la base de datos. Vaya a la configuración de AWS Security Groups para MySQL RDS y edite la regla de IP entrante actualizando MyIP.

Me enfrenté a este problema y hacer lo anterior me solucionó el problema.

0
Ajitesh

Asegúrese de haber ingresado detalles válidos en application.properties y si su servidor de base de datos está disponible. Como ejemplo, cuando se está conectando con MySQL, verifique siXAMPPse está ejecutando correctamente.

0
Lahiru Gamage

Lo mismo pero en un JBoss WildFly AS .

Resuelto con propiedades en mi 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>

Si está utilizando esta línea:

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

asegúrese de que env.getProperty("hibernate.dialect") no sea nulo.

0
zygimantus

Me enfrenté a este problema debido a que la versión Mysql 8.0.11 regresó a 5.7 resuelto por mí

0
Gautam Yadav

Tuve el mismo problema y, después de la depuración, resultó que Spring application.properties tenía una dirección IP incorrecta para el servidor DB.

spring.datasource.url=jdbc:Oracle:thin:@WRONG:1521/DEV
0
user648026