Ich versuche, eine Spring-Boot-Anwendung auszuführen, die den Ruhezustand über spring-jpa verwendet, aber ich erhalte den folgenden Fehler:
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 wie folgt:
<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 Konfiguration für den Ruhezustand lautet wie folgt (die Dialektkonfiguration ist die letzte 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?
application.propertes
? Ich bevorzuge einen Weg, auf dem ich die gesamte Konfiguration in der Klasse HibernateConfig durchführe.Beim Starten der Anwendung (mit Spring Boot) mit heruntergefahrenem Datenbankserver trat ein ähnliches Problem auf .
Der Ruhezustand kann den richtigen Dialekt bestimmen, der automatisch verwendet werden soll. Dazu ist jedoch eine Live-Verbindung zur Datenbank erforderlich.
quelle
Fügen Sie die
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect
Datei application.properties hinzuquelle
Ich habe diesen Fehler erhalten, als meine Datenbank nicht erstellt wurde. Nach dem manuellen Erstellen der Datenbank hat es einwandfrei funktioniert.
quelle
Ich hatte auch ein ähnliches Problem. Dies lag jedoch an dem ungültigen Passwort. Außerdem möchte ich sagen, dass Ihr Code mit spring alten Code zu sein scheint. Sie haben bereits erwähnt, dass Sie Spring Boot verwenden, was bedeutet, dass die meisten Dinge automatisch für Sie konfiguriert werden. Der Dialekt für den Ruhezustand wird automatisch basierend auf dem im Klassenpfad verfügbaren DB-Treiber zusammen mit gültigen Anmeldeinformationen ausgewählt, mit denen die Verbindung ordnungsgemäß getestet werden kann. Wenn es ein Problem mit der Verbindung gibt, wird erneut der gleiche Fehler angezeigt. In application.properties werden nur 3 Eigenschaften benötigt
quelle
Ich hatte das gleiche Problem und mein Problem war, dass die Datenbank, zu der ich eine Verbindung herstellen wollte, nicht vorhanden war.
Ich habe die Datenbank erstellt, die URL / Verbindungszeichenfolge überprüft und erneut ausgeführt, und alles hat wie erwartet funktioniert.
quelle
Dies geschieht, weil Ihr Code nicht für die Verbindung der Datenbank geeignet ist. Stellen Sie sicher, dass Sie MySQL-Treiber und Benutzername haben, Passwort korrekt.
quelle
Stellen Sie sicher, dass
application.properties
alle Informationen korrekt sind: (Ich habe meinen Datenbank-Port von geändert8889
, damit3306
es funktioniert.)quelle
Im Frühjahrsstart für jpa java config müssen Sie JpaBaseConfiguration erweitern und die abstrakten Methoden implementieren.
quelle
Entfernen Sie die redundante Ruhezustandskonfiguration
Wenn Sie Spring Boot verwenden, müssen Sie die JPA- und Hibernate-Konfiguration nicht explizit angeben, da Spring Boot dies für Sie tun kann.
Fügen Sie Datenbankkonfigurationseigenschaften hinzu
In der
application.properties
Spring Boot-Konfigurationsdatei müssen Sie Ihre Datenbankkonfigurationseigenschaften hinzufügen:Fügen Sie bestimmte Eigenschaften für den Ruhezustand hinzu
In derselben
application.properties
Konfigurationsdatei können Sie auch benutzerdefinierte Eigenschaften für den Ruhezustand festlegen:Das ist es!
quelle
Ich hatte das gleiche Problem. Durch Hinzufügen dieser zur application.properties wurde das Problem behoben:
quelle
In meinem Fall konnte der Benutzer keine Verbindung zur Datenbank herstellen. Wenn das Protokoll kurz vor der Ausnahme eine Warnung enthält, tritt dasselbe Problem auf:
quelle
Stellen Sie sicher, dass Sie Ihre Datenbank wie OP in Ihrem POM haben. Das war mein problem
quelle
Mein Problem war, dass die eingebettete Datenbank bereits verbunden war. Verbindung schließen
quelle
Ich habe dieses Problem erhalten, als Eclipse den JDBC-Treiber nicht finden konnte. Musste eine Gradle-Aktualisierung von der Sonnenfinsternis machen, um diese Arbeit zu bekommen.
quelle
Im Folgenden sind einige der Gründe für das
hibernate.dialect
nicht festgelegte Problem aufgeführt. Die meisten dieser Ausnahmen werden im Startprotokoll angezeigt, auf das schließlich das erwähnte Problem folgt.Beispiel: In Spring Boot App mit Postgres DB
1. Überprüfen Sie, ob die Datenbank tatsächlich installiert und der Server gestartet ist.
2. Überprüfen Sie, ob der Datenbankname korrekt angegeben ist.
org.postgresql.util.PSQLException: FATAL: Datenbank "foo" existiert nicht
In der
application.properties
Datei,aber
foo
existierte nicht. Also habe ich die Datenbank von pgAdmin für Postgres erstellt3. Überprüfen Sie, ob auf den Hostnamen und den Serverport zugegriffen werden kann.
4. Überprüfen Sie, ob die Datenbankanmeldeinformationen korrekt sind.
org.postgresql.util.PSQLException: FATAL: Kennwortauthentifizierung für Benutzer "postgres" fehlgeschlagen
spring.datasource.username= {DB USERNAME HERE}
spring.datasource.password= {DB PASSWORD HERE}
quelle
Wenn Sie diese Zeile verwenden:
Stellen Sie sicher, dass dies
env.getProperty("hibernate.dialect")
nicht null ist.quelle
Gelöst mit Eigenschaften in meinem
META-INF/persistence.xml
quelle
Bei Benutzern von AWS MySQL RDS kann es vorkommen, dass Sie keine Verbindung zur Datenbank herstellen können. Wechseln Sie zur Einstellung für AWS-Sicherheitsgruppen für MySQL RDS und bearbeiten Sie die eingehende IP-Regel, indem Sie MyIP aktualisieren.
Ich war mit diesem Problem konfrontiert und habe das Problem für mich behoben.
quelle
Ich hatte auch dieses Problem. In meinem Fall lag es daran, dass dem MySQL-Benutzer keine Zuschüsse zugewiesen wurden. Durch das Zuweisen von Zuschüssen zu MySQL-Benutzern, die meine App verwendet, wurde das Problem behoben:
quelle
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
quelle
Ich habe diese Fehlermeldung in den folgenden drei Fällen reproduziert:
Die naheliegende Lösung besteht darin, einen neuen Datenbankbenutzer mit demselben Benutzernamen und Kennwort wie in der Spring-Boot-App zu erstellen oder den Benutzernamen und das Kennwort in Ihren Spring-Boot-App-Dateien so zu ändern, dass sie mit einem vorhandenen Datenbankbenutzer übereinstimmen und diesem Datenbankbenutzer ausreichende Berechtigungen gewähren. Im Falle einer MySQL-Datenbank kann dies wie folgt gezeigt werden:
Natürlich gibt es ähnliche Befehle in Postgresql, aber ich habe nicht getestet, ob diese Fehlermeldung im Fall von Postgresql in diesen drei Fällen reproduziert werden kann.
quelle
Ich hatte das gleiche Problem und es wurde dadurch verursacht, dass keine Verbindung zur Datenbankinstanz hergestellt werden konnte. Suchen Sie im Protokoll über diesem Fehler nach dem Ruhezustand HHH000342. Er sollte Ihnen eine Vorstellung davon geben, wo die Datenbankverbindung fehlschlägt (falscher Benutzername / Pass, URL usw.).
quelle
Dies ist mir passiert, weil ich
conf.configure();
vor Beginn der Sitzung nicht Folgendes hinzugefügt hatte:quelle
Stellen Sie sicher, dass Sie in application.properties gültige Details eingegeben haben und ob Ihr Datenbankserver verfügbar ist. Wenn Sie beispielsweise eine Verbindung mit MySQL herstellen, überprüfen Sie, ob XAMPP ordnungsgemäß ausgeführt wird.
quelle
Ich hatte das gleiche Problem: Die Datenbank, die ich verbinden wollte, existierte nicht. Ich habe verwendet
jpa.database=default
(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 ohne Änderungen einwandfrei.quelle
Ich hatte dieses Problem, weil die Version von MySQL 8.0.11 auf 5.7 zurückgesetzt wurde und für mich gelöst wurde
quelle
Ich hatte den gleichen Fehler nach der Verwendung der Code-Generierung im Ruhezustand
https://www.mkyong.com/hibernate/how-to-generate-code-with-hibernate-tools/
dann
hibernate.cfg.xml
wurde das in/src/main/java
aber ohne die verbindungsparameter nach dem entfernen erstellt - mein problem wurde gelöstquelle
Wenn der vorhergehende Fehler in Protokoll dies ist: „ERROR - HikariPool-1 - jdbcUrl ist erforderlich , mit driver“ , dann ist die Lösung neu zu schreiben „url“ auf „jdbc-url“ nach diesem: Datenbank application.yml für Frühjahr Boot von Anwendungen .Eigenschaften
quelle
Ich hatte den gleichen Fehler,
In meinem Fall enthielt die WAR application.properties, die auf den Entwicklungsserver
verweisen, während die externe application.properties auf den richtigen DB-Server verweist.
Stellen Sie sicher, dass Sie keine anderen application.properties im Klassenpfad / in den Jars haben ...
quelle