org.hibernate.HibernateException: el acceso a DialectResolutionInfo no puede ser nulo cuando no se establece ‘hibernate.dialect’

Estoy intentando ejecutar una aplicación de arranque de spring que utiliza hibernate a través de spring-jpa, pero estoy recibiendo 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:

  org.springframework.boot spring-boot-starter-parent 1.1.8.RELEASE    org.springframework.boot spring-boot-starter-web   org.springframework.boot spring-boot-starter-actuator   org.springframework.security spring-security-web   org.springframework.security spring-security-config   org.springframework.security spring-security-taglibs   org.springframework.boot spring-boot-starter-data-jpa   commons-dbcp commons-dbcp   

mi configuración de hibernación es aquella (la configuración del 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í?

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

Asegúrese de tener una 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 acceso a una SessionFactory y eso es básicamente para el mismo origen 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 esta forma, tiene 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 lo habilitará. 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 detectar todas sus clases (incluidas las entidades y los repositorys basados ​​en Spring Data).

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

Estaba enfrentando 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.

Obtuve este error cuando no se creó mi base de datos. Después de crear el DB manualmente, funcionó bien.

También me enfrenté a un problema similar. Pero fue debido a la contraseña inválida provista. Además, me gustaría decir que su código parece ser un código de estilo antiguo que usa la spring. Ya mencionaste que estás usando el arranque de resorte, lo que significa que la mayoría de las cosas se configurarán automáticamente para ti. el dialecto de hibernación se seleccionará automáticamente según el controlador de base de datos disponible en el classpath 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 se necesitan 3 propiedades 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= 

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

Me encontré con el mismo problema y mi problema era que el DB al que intentaba conectar no existía.

Creé el DB, verifiqué el URL / cadena de conexión y reran y todo funcionó como se esperaba.

esto está sucediendo porque su código no es completo para conectar la base de datos. Asegúrese de tener el controlador y el nombre de usuario de mysql, la contraseña correcta.

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

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

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

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

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

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

Si estás usando esta línea:

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

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

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

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

Asegúrese de haber ingresado los detalles válidos en application.properties y si su servidor de base de datos está disponible. Como ejemplo, cuando te conectas con MySQL comprueba si XAMPP se está ejecutando correctamente.

Enfrenté el mismo problema: el DB que intentaba 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.

Lo mismo pero en un JBoss WildFly AS .

Resuelto con propiedades en mi META-INF/persistence.xml

      

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 Grupos de seguridad de AWS para MySQL RDS y edite la regla de IP entrante al actualizar MyIP.

Enfrenté este problema y hacer lo anterior me solucionó el problema.

Me enfrenté a este problema debido a la versión de Mysql 8.0.11 volviendo a 5.7 resuelto para mí

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

Recibí este problema cuando Eclipse no pudo encontrar el controlador JDBC. Tuve que hacer una actualización de gradle del eclipse para hacer este trabajo.