Próbuję uruchomić aplikację Spring-Boot, która używa hibernacji za pośrednictwem Spring-JPA, ale otrzymuję ten błąd:
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
mój plik pom.xml to:
<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>
moja konfiguracja hibernacji jest taka (konfiguracja dialektu jest w ostatniej metodzie z tej klasy):
@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");
}
};
}
}
co tutaj robię źle?
application.propertes
? Wolę sposób, w jaki wykonuję całą konfigurację w klasie HibernateConfig.Miałem podobny problem podczas uruchamiania aplikacji (przy użyciu Spring Boot) przy wyłączonym serwerze bazy danych .
Hibernacja może określić właściwy dialekt do użycia automatycznie, ale w tym celu potrzebuje połączenia z bazą danych na żywo.
źródło
dodaj
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect
w pliku application.propertiesźródło
Wystąpił ten błąd, gdy moja baza danych nie została utworzona. Po ręcznym utworzeniu DB działało dobrze.
źródło
Napotkałem również podobny problem. Ale było to spowodowane podanym nieprawidłowym hasłem. Chciałbym również powiedzieć, że twój kod wydaje się być kodem w starym stylu, używając wiosny. Wspomniałeś już, że używasz wiosennego rozruchu, co oznacza, że większość rzeczy zostanie dla Ciebie automatycznie skonfigurowana. hibernacja zostanie automatycznie wybrana na podstawie sterownika DB dostępnego w ścieżce klasy wraz z prawidłowymi poświadczeniami, których można użyć do prawidłowego przetestowania połączenia. W przypadku problemów z połączeniem ponownie napotkasz ten sam błąd. potrzebne są tylko 3 właściwości w application.properties
źródło
Natrafiłem na ten sam problem, a moim problemem było to, że baza danych, z którą próbowałem się połączyć, nie istniała.
Utworzyłem DB, zweryfikowałem adres URL / ciąg połączenia i przestawiłem ponownie i wszystko działało zgodnie z oczekiwaniami.
źródło
dzieje się tak, ponieważ Twój kod nie łączy się z bazą danych. Upewnij się, że masz sterownik mysql i nazwę użytkownika, poprawne hasło.
źródło
Upewnij się, że masz
application.properties
wszystkie poprawne informacje: (Zmieniłem mój port db z8889
na3306
to działało)źródło
W wiosennym rozruchu dla konfiguracji jpa java musisz rozszerzyć JpaBaseConfiguration i zaimplementować jej abstrakcyjne metody.
źródło
Usuń zbędną konfigurację hibernacji
Jeśli używasz Spring Boot, nie musisz jawnie podawać konfiguracji JPA i Hibernacji, ponieważ Spring Boot może to zrobić za Ciebie.
Dodaj właściwości konfiguracyjne bazy danych
W
application.properties
pliku konfiguracyjnym Spring Boot dodano właściwości konfiguracji bazy danych:Dodaj właściwości hibernacji
I w tym samym
application.properties
pliku konfiguracyjnym możesz również ustawić niestandardowe właściwości Hibernacji:Otóż to!
źródło
Miałem ten sam problem. dodanie tego do application.properties rozwiązało problem:
źródło
W moim przypadku użytkownik nie mógł połączyć się z bazą danych. Jeśli będzie miał ten sam problem, jeśli dziennik zawiera ostrzeżenie tuż przed wyjątkiem:
źródło
Upewnij się, że masz swoją bazę danych w pom, tak jak OP. To był mój problem.
źródło
Mój problem polegał na tym, że osadzona baza danych była już podłączona. ścisłe połączenie
źródło
Ten problem wystąpił, gdy Eclipse nie mógł znaleźć sterownika JDBC. Musiałem zrobić stopniowe odświeżenie z zaćmienia, aby uzyskać tę pracę.
źródło
Oto niektóre z przyczyn
hibernate.dialect
nie ustawionego problemu. Większość tych wyjątków jest wyświetlana w dzienniku uruchamiania, po którym następuje wspomniany problem.Przykład: W wiosennej aplikacji rozruchowej z Postgres DB
1. Sprawdź, czy baza danych jest faktycznie zainstalowana i czy serwer jest uruchomiony.
2. Sprawdź, czy nazwa bazy danych jest poprawnie wymieniona.
org.postgresql.util.PSQLException: FATAL: baza danych „foo” nie istnieje
W
application.properties
plikuale
foo
nie istniało. Więc stworzyłem bazę danych z pgAdmin dla postgres3. Sprawdź, czy nazwa hosta i port serwera są dostępne.
4. Sprawdź, czy poświadczenia bazy danych są poprawne.
org.postgresql.util.PSQLException: FATAL: uwierzytelnienie hasła nie powiodło się dla użytkownika „postgres”
spring.datasource.username= {DB USERNAME HERE}
spring.datasource.password= {DB PASSWORD HERE}
źródło
Jeśli używasz tej linii:
upewnij się, że
env.getProperty("hibernate.dialect")
nie jest to zero.źródło
Rozwiązany z właściwościami w moim
META-INF/persistence.xml
źródło
Dla osób pracujących z AWS MySQL RDS może się zdarzyć, gdy nie będzie można połączyć się z bazą danych. Przejdź do ustawienia Grup bezpieczeństwa AWS dla MySQL RDS i edytuj regułę przychodzącego IP, odświeżając MyIP.
Napotkałem ten problem i wykonanie powyższej czynności rozwiązało problem.
źródło
Też miałem ten problem. W moim przypadku było to spowodowane tym, że użytkownikowi MySQL nie przydzielono żadnych dotacji. Przypisywanie dotacji użytkownikowi MySQL, z którego korzysta moja aplikacja, rozwiązało problem:
źródło
Miałem ten sam problem i po debugowaniu okazuje się, że Spring application.properties miał zły adres IP dla serwera DB
źródło
Powtórzyłem ten komunikat o błędzie w następujących trzech przypadkach:
Oczywistym rozwiązaniem jest utworzenie nowego użytkownika bazy danych o tej samej nazwie użytkownika i haśle, co w aplikacji Spring-boot lub zmiana nazwy użytkownika i hasła w plikach aplikacji Spring-Boot, aby dopasować do istniejącego użytkownika bazy danych i przyznać wystarczające uprawnienia temu użytkownikowi bazy danych. W przypadku bazy danych MySQL można to zrobić, jak pokazano poniżej:
Oczywiście istnieją podobne polecenia w Postgresql, ale nie przetestowałem, czy w przypadku Postgresql ten komunikat o błędzie można odtworzyć w tych trzech przypadkach.
źródło
Miałem ten sam problem i był on spowodowany niemożnością połączenia się z instancją bazy danych. Poszukaj błędu hibernacji HHH000342 w dzienniku powyżej tego błędu, powinien dać ci wyobrażenie o tym, gdzie nie działa połączenie db (niepoprawna nazwa użytkownika / hasło, adres URL itp.)
źródło
Stało się tak, ponieważ nie dodałem
conf.configure();
przed rozpoczęciem sesji:źródło
Upewnij się, że wpisałeś poprawny szczegół w application.properties i czy twój serwer bazy danych jest dostępny. Jako przykład podczas łączenia się z MySQL sprawdź, czy XAMPP działa poprawnie.
źródło
Napotkałem ten sam problem: baza danych, z którą próbowałem się połączyć, nie istniała. Użyłem
jpa.database=default
(co chyba oznacza, że spróbuje połączyć się z bazą danych, a następnie automatycznie wybierze dialekt). Gdy uruchomiłem bazę danych, działała dobrze bez żadnych zmian.źródło
Napotkałem ten problem ze względu na to, że wersja Mysql 8.0.11 powróciła do 5.7 rozwiązana dla mnie
źródło
Miałem ten sam błąd po użyciu generowania kodu hibernacji
https://www.mkyong.com/hibernate/how-to-generate-code-with-hibernate-tools/
następnie
hibernate.cfg.xml
został utworzony,/src/main/java
ale bez parametrów połączenia po jego usunięciu - mój problem został rozwiązanyźródło
Jeśli poprzedni błąd w dzienniku brzmiał następująco: „BŁĄD - HikariPool-1 - jdbcUrl jest wymagany dla driverClassName”, wówczas rozwiązaniem jest przepisanie „url” na „jdbc-url” zgodnie z tym: Database application.yml dla rozruchu wiosennego z aplikacji .nieruchomości
źródło
Miałem ten sam błąd,
w moim przypadku WAR zawierał application.properties, które wskazywały na serwer programistyczny,
gdzie zewnętrzny application.properties wskazywał właściwy serwer DB.
upewnij się, że nie masz żadnych innych application.properties w ścieżce klasy / słoikach ...
źródło