org.hibernate.HibernateException: el acceso a DialectResolutionInfo no puede ser nulo cuando 'hibernate.dialect' no está configurado

Resuelto Kleber Mota asked hace 9 años • 38 respuestas

Estoy intentando ejecutar una aplicación Spring-boot que usa hibernación a través de Spring-jpa, pero aparece 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 esa (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í?

Kleber Mota avatar Oct 24 '14 20:10 Kleber Mota
Aceptado

Primero elimine toda su configuración. Spring Boot la iniciará por usted.

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

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 SessionFactoryy 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 para 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 an EntityManagerFactorycomo a SessionFactory.

ACTUALIZACIÓN: A partir de Hibernate 5, en SessionFactoryrealidad extiende el archivo EntityManagerFactory. Entonces, para obtener un, SessionFactorysimplemente puedes enviarlo EntityManagerFactoryo usar el unwrapmétodo para obtener uno.

public class SomeHibernateRepository {

  @PersistenceUnit
  private EntityManagerFactory emf;

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

}

Suponiendo que tiene una clase con un mainmétodo, @EnableAutoConfigurationno necesita la @EnableTransactionManagementanotación, ya que Spring Boot la habilitará para usted. Una clase de aplicación básica en el com.spring.apppaquete 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 repositorios basados ​​en Spring Data).

ACTUALIZACIÓN: Estas anotaciones se pueden reemplazar con una única @SpringBootApplicationen versiones más recientes de Spring Boot.

@SpringBootApplication
public class Application {

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

También sugeriría eliminar la commons-dbcpdependencia, ya que eso permitiría a Spring Boot configurar una HikariCPimplementación más rápida y sólida.

M. Deinum avatar Oct 24 '2014 13:10 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 automáticamente el dialecto correcto a utilizar, pero para ello necesita una conexión activa a la base de datos.

mhnagaoka avatar Apr 08 '2015 16:04 mhnagaoka

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

alpine avatar May 27 '2017 10:05 alpine

Recibí este error cuando no se creó mi base de datos. Después de crear la base de datos manualmente, funcionó bien.

ACV avatar Sep 05 '2015 19:09 ACV

También me enfrenté a un problema similar. Pero se debió a que la contraseña proporcionada no era válida. Además, me gustaría decir que su código parece ser un código antiguo que usa Spring. Ya mencionaste que estás usando Spring Boot, 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. sólo 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=
Pankaj avatar Nov 08 '2015 18:11 Pankaj