Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set

I am trying run a spring-boot application which uses hibernate via spring-jpa, but i am getting this 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 

my pom.xml file is this:

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

my hibernate configuration is that (the dialect configuration is in the last method from this class):

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

what I am doing wrong here?

like image 914
Kleber Mota Avatar asked Oct 24 '14 13:10

Kleber Mota


People also ask

How do you resolve access to DialectResolutionInfo Cannot be null when Hibernate Dialect not set?

Fix for HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate. dialect' not set. After some research and debugging, I was able to fix it. The part that is missing in the official documentation is that we need to apply the configuration properties to StandardServiceRegistryBuilder .

What is a Hibernate Dialect?

A hibernate dialect gives information to the framework of how to convert hibernate queries(HQL) into native SQL queries. Since Hibernate is database agnostic. It can work with different databases. However, databases have proprietary extensions/native SQL variations, and set/sub-set of SQL standard implementations.

What is Spring JPA Hibernate DDL Auto?

spring. jpa. hibernate. ddl-auto (enum) is a Hibernate feature that controls the behavior in a more fine-grained way.


2 Answers

First remove all of your configuration Spring Boot will start it for you.

Make sure you have an application.properties in your classpath and add the following 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 

If you really need access to a SessionFactory and that is basically for the same datasource, then you can do the following (which is also documented here although for XML, not JavaConfig).

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

That way you have both an EntityManagerFactory and a SessionFactory.

UPDATE: As of Hibernate 5 the SessionFactory actually extends the EntityManagerFactory. So to obtain a SessionFactory you can simply cast the EntityManagerFactory to it or use the unwrap method to get one.

public class SomeHibernateRepository {    @PersistenceUnit   private EntityManagerFactory emf;    protected SessionFactory getSessionFactory() {     return emf.unwrap(SessionFactory.class);   }  } 

Assuming you have a class with a main method with @EnableAutoConfiguration you don't need the @EnableTransactionManagement annotation, as that will be enabled by Spring Boot for you. A basic application class in the com.spring.app package should be enough.

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

Something like that should be enough to have all your classes (including entities and Spring Data based repositories) detected.

UPDATE: These annotations can be replaced with a single @SpringBootApplication in more recent versions of Spring Boot.

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

I would also suggest removing the commons-dbcp dependency as that would allow Spring Boot to configure the faster and more robust HikariCP implementation.

like image 124
M. Deinum Avatar answered Sep 19 '22 02:09

M. Deinum


I was facing a similar problem when starting up the application (using Spring Boot) with the database server down.

Hibernate can determine the correct dialect to use automatically, but in order to do this, it needs a live connection to the database.

like image 41
mhnagaoka Avatar answered Sep 19 '22 02:09

mhnagaoka