it-swarm.com.de

org.hibernate.HibernateException: Der Zugriff auf DialectResolutionInfo darf nicht null sein, wenn 'hibernate.dialect' nicht festgelegt ist

Ich versuche, eine Spring-Boot-Anwendung auszuführen, die den Ruhezustand über Spring-Jpa verwendet, aber ich erhalte diese Fehlermeldung

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

meine pom.xml-Datei lautet:

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

meine Hibernate-Konfiguration ist die (die Dialekt-Konfiguration befindet sich in der letzten Methode dieser Klasse):

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

was mache ich hier falsch?

142
Kleber Mota

Entfernen Sie zunächst alle Ihre Konfiguration. Spring Boot startet es für Sie. Wenn Sie wirklich eine SessionFactory anstelle einer EntityManagerFactory benötigen, fügen Sie eine HibernateJpaSessionFactoryBean hinzu. 

Stellen Sie sicher, dass Sie einen application.properties in Ihrem Klassenpfad haben, und fügen Sie die folgenden Eigenschaften hinzu.

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

Wenn Sie wirklich auf eine SessionFactory zugreifen müssen, und dies im Wesentlichen für dieselbe Datenquelle gilt, können Sie Folgendes tun (was auch dokumentiert ist hier obwohl für XML, nicht JavaConfig).

@Configuration        
public class HibernateConfig {

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

Auf diese Weise haben Sie sowohl eine EntityManagerFactory als auch eine SessionFactory.

Angenommen, Sie haben eine Klasse mit einer main-Methode mit @EnableAutoConfiguration, benötigen Sie die @EnableTransactionManagement-Annotation nicht, da diese von Spring Boot für Sie aktiviert wird. Eine grundlegende Anwendungsklasse im Paket com.spring.app sollte ausreichen.

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {


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

} 

So etwas sollte ausreichen, um alle Ihre Klassen (einschließlich Entitäten und auf Spring Data basierende Repositorys) erkennen zu lassen.

Ich würde auch vorschlagen, die commons-dbcp-Abhängigkeit zu entfernen, da Spring Boot die schnellere und robustere HikariCP -Implementierung konfigurieren kann.

151
M. Deinum

Beim Starten der Anwendung (mit Spring Boot)/war ein ähnliches Problem aufgetreten der Datenbankserver war nicht aktiv .

Der Ruhezustand kann den richtigen Dialekt ermitteln, der automatisch verwendet werden soll. Dafür ist jedoch eine Live-Verbindung zur Datenbank erforderlich.

107
mhnagaoka

Ich habe diesen Fehler erhalten, als meine Datenbank nicht erstellt wurde. Nachdem die Datenbank manuell erstellt wurde, funktionierte sie einwandfrei.

16
ACV

Ich war auch mit einem ähnlichen Problem konfrontiert. Es wurde jedoch aufgrund des ungültigen Passworts angegeben. Außerdem würde ich gerne sagen, dass Ihr Code ein alter Code ist, der Frühling verwendet. Sie haben bereits erwähnt, dass Sie Federstiefel verwenden, was bedeutet, dass die meisten Dinge automatisch für Sie konfiguriert werden. Hibernate-Dialekt wird automatisch basierend auf dem im Klassenpfad verfügbaren DB-Treiber zusammen mit gültigen Berechtigungsnachweisen ausgewählt, mit denen die Verbindung ordnungsgemäß getestet werden kann. Wenn bei der Verbindung Probleme auftreten, werden Sie erneut mit dem gleichen Fehler konfrontiert. In application.properties sind nur 3 Eigenschaften erforderlich

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

fügen Sie spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect in der Datei application.properties hinzu

10
alpine

Ich hatte das gleiche Problem und mein Problem war, dass die Datenbank, mit der ich mich verbinden wollte, nicht existierte.

Ich habe die Datenbank erstellt, die URL/Verbindungszeichenfolge überprüft und erneut ausgeführt, und alles funktionierte wie erwartet.

6
Eric B.

Stellen Sie sicher, dass Ihr application.properties alle richtigen Informationen enthält: (Ich habe meinen Datenbank-Port von 8889 in 3306 geändert.

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

dies geschieht, weil Ihr Code die Datenbank nicht verbinden kann. Vergewissern Sie sich, dass Sie den MySQL-Treiber und den Benutzernamen sowie das richtige Kennwort haben. 

3
user7169604

Stellen Sie sicher, dass sich Ihre Datenbank in Ihrem Pom befindet, wie es bei OP der Fall war. Das war mein Problem.

2
obesechicken13

In meinem Fall konnte der Benutzer keine Verbindung zur Datenbank herstellen. Wenn dasselbe Problem auftritt, wenn das Protokoll unmittelbar vor der Ausnahme eine Warnung enthält:

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

Mein Problem war, dass die eingebettete Datenbank bereits verbunden war. Verbindung schließen

2
doesnt_matter

Dieses Problem ist aufgetreten, als Eclipse den JDBC-Treiber nicht finden konnte. Musste eine gradle Aktualisierung von der Eclipse durchführen, um diese Arbeit zu erhalten.

1

In Spring Boot für Java Java Config müssen Sie JpaBaseConfiguration erweitern und die abstrakten Methoden implementieren. 

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

}
1
Yaroslav

Ich hatte auch dieses Problem. In meinem Fall lag es daran, dass MySQL-Benutzern keine Zuschüsse zugewiesen wurden. Durch Zuweisen von Zuweisungen an MySQL-Benutzer, die von meiner App verwendet werden, wurde das Problem behoben:

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

Dies passierte mir, weil ich die conf.configure(); nicht vor Beginn der Sitzung hinzugefügt hatte: 

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

Ich war mit dem gleichen Problem konfrontiert: Die Datenbank, die ich verbinden wollte, war nicht vorhanden. Ich habe jpa.database=default verwendet (was bedeutet, dass versucht wird, eine Verbindung zur Datenbank herzustellen und dann automatisch den Dialekt auszuwählen). Nachdem ich die Datenbank gestartet hatte, funktionierte sie einwandfrei ohne Änderungen.

0
Avishekh Tewari

Wenn der vorhergehende Fehler im Protokoll folgendermaßen lautete: "ERROR - HikariPool-1 - jdbcUrl ist mit driverClassName erforderlich".... Die Lösung lautet, "url" in "jdbc-url" entsprechend der folgenden Anweisung umzuschreiben: Database application.yml für Spring boot von applications.properties

0
JanBrus

Ich hatte den gleichen Fehler, nachdem ich die Hibernate-Code-Generierung verwendet hatte 

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

dann wurde der hibernate.cfg.xml in /src/main/Java erstellt, jedoch ohne die Verbindungsparameter nach dem Entfernen - mein Problem wurde gelöst 

0
RMagen

Ich hatte das gleiche Problem und es wurde dadurch verursacht, dass keine Verbindung zur Datenbankinstanz hergestellt werden konnte. Suchen Sie nach dem Ruhezustand-Fehler HHH000342 im Protokoll über diesem Fehler. Es sollte Ihnen eine Idee geben, wo die Datenbankverbindung fehlschlägt (falscher Benutzername/Pass, URL usw.)

0
Farouk

Für diejenigen, die mit AWS MySQL RDS arbeiten, kann dies auftreten, wenn Sie keine Verbindung zur Datenbank herstellen können. Wechseln Sie zu AWS Security Groups-Einstellung für MySQL RDS und bearbeiten Sie die eingehende IP-Regel, indem Sie MyIP aktualisieren. 

Ich war mit diesem Problem konfrontiert und das Problem wurde für mich behoben.

0
Ajitesh

Stellen Sie sicher, dass Sie gültige Details inapplication.propertieseingegeben haben und ob Ihr Datenbankserver verfügbar ist. Wenn Sie beispielsweise eine Verbindung mit MySQL herstellen, prüfen Sie, obXAMPPordnungsgemäß ausgeführt wird.

0
Lahiru Gamage

Gleich aber in einer JBoss WildFly AS.

Gelöst mit Eigenschaften in meinem 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>

Ich hatte den gleichen Fehler,

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

in meinem Fall enthielt die WAR application.properties, die auf den Entwicklungsserver hinwiesen
wobei external application.properties auf den richtigen DB-Server zeigte.

stellen Sie sicher, dass Sie keine anderen application.properties im classpath/jars haben ...

0
user648026

Wenn Sie diese Zeile verwenden:

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

stellen Sie sicher, dass env.getProperty("hibernate.dialect") nicht null ist.

0
zygimantus

Ich bin diesem Problem begegnet, weil die Version Mysql 8.0.11 wieder auf 5.7 zurückgesetzt wurde

0
Gautam Yadav

Ich hatte das gleiche Problem und nach dem Debuggen stellte sich heraus, dass Spring application.properties eine falsche IP-Adresse für den DB-Server hatte

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