Ik probeer een spring-boot-toepassing uit te voeren die hibernate gebruikt via spring-jpa, maar ik krijg deze foutmelding:
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
mijn pom.xml-bestand is dit:
<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>
mijn slaapstandconfiguratie is dat (de dialectconfiguratie bevindt zich in de laatste methode van deze 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");
}
};
}
}
wat doe ik hier verkeerd?
Antwoord 1, autoriteit 100%
Verwijder eerst al uw configuratie Spring Boot zal het voor u starten.
Zorg ervoor dat u een application.properties
in uw klassenpad heeft en voeg de volgende eigenschappen toe.
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
Als je echt toegang nodig hebt tot een SessionFactory
en dat is eigenlijk voor dezelfde gegevensbron, dan kun je het volgende doen (wat ook is gedocumenteerd hierhoewel voor XML, niet JavaConfig).
@Configuration
public class HibernateConfig {
@Bean
public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) {
HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
factory.setEntityManagerFactory(emf);
return factory;
}
}
Op die manier heb je zowel een EntityManagerFactory
als een SessionFactory
.
UPDATE:vanaf Hibernate 5 breidt SessionFactory
feitelijk de EntityManagerFactory
uit. Dus om een SessionFactory
te verkrijgen, kun je eenvoudig de EntityManagerFactory
ernaar casten of de methode unwrap
gebruiken om er een te krijgen.
public class SomeHibernateRepository {
@PersistenceUnit
private EntityManagerFactory emf;
protected SessionFactory getSessionFactory() {
return emf.unwrap(SessionFactory.class);
}
}
Ervan uitgaande dat je een klasse hebt met een main
-methode met @EnableAutoConfiguration
, heb je de annotatie @EnableTransactionManagement
niet nodig, want dat is wel zo ingeschakeld door Spring Boot voor u. Een basistoepassingsklasse in het pakket com.spring.app
zou voldoende moeten zijn.
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
Zoiets zou voldoende moeten zijn om al je klassen (inclusief entiteiten en op Spring Data gebaseerde opslagplaatsen) te detecteren.
UPDATE:deze annotaties kunnen worden vervangen door een enkele @SpringBootApplication
in recentere versies van Spring Boot.
@SpringBootApplication
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
Ik zou ook willen voorstellen om de commons-dbcp
-afhankelijkheid te verwijderen, omdat Spring Boot dan de snellere en robuustere HikariCP
implementatie.
Antwoord 2, autoriteit 79%
Ik had een soortgelijk probleem bij het opstarten van de applicatie (met Spring Boot) met de databaseserver uit.
Hibernate kan het juiste dialect bepalen om automatisch te gebruiken, maar om dit te doen, heeft het een live verbinding met de database nodig.
Antwoord 3, autoriteit 16%
voeg spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect
in het bestand application.properties
Antwoord 4, autoriteit 9%
Ik kreeg deze foutmelding toen mijn database niet werd aangemaakt. Na het handmatig aanmaken van de database werkte het prima.
Antwoord 5, autoriteit 7%
Ik heb ook met een soortgelijk probleem te maken gehad. Maar het was te wijten aan het verstrekte ongeldige wachtwoord. Ik zou ook willen zeggen dat je code ouderwetse code lijkt te zijn met lente. Je hebt al gezegd dat je springboot gebruikt, wat betekent dat de meeste dingen automatisch voor je worden geconfigureerd. hibernate-dialect wordt automatisch geselecteerd op basis van het DB-stuurprogramma dat beschikbaar is op het klassenpad, samen met geldige inloggegevens die kunnen worden gebruikt om de verbinding correct te testen. Als er een probleem is met de verbinding, krijgt u opnieuw dezelfde fout. slechts 3 eigenschappen nodig in 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=
Antwoord 6, autoriteit 4%
Ik kwam hetzelfde probleem tegen en mijn probleem was dat de database waarmee ik verbinding probeerde te maken niet bestond.
Ik heb de database gemaakt, de URL/verbindingsreeks geverifieerd en opnieuw uitgevoerd en alles werkte zoals verwacht.
Antwoord 7, autoriteit 3%
Ik had hetzelfde probleem. door dit toe te voegen aan de application.properties is het probleem opgelost:
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
Antwoord 8, autoriteit 2%
Verwijder de redundante slaapstandconfiguratie
Als u Spring Boot gebruikt, hoeft u de JPA- en Hibernate-configuratie niet expliciet op te geven, aangezien Spring Boot dat voor u kan doen.
Databaseconfiguratie-eigenschappen toevoegen
In het application.properties
Spring Boot-configuratiebestand heeft u de optie om uw databaseconfiguratie-eigenschappen toe te voegen:
spring.datasource.driverClassName = org.postgresql.Driver
spring.datasource.url = jdbc:postgresql://localhost:5432/teste
spring.datasource.username = klebermo
spring.datasource.password = 123
Hibernate-specifieke eigenschappen toevoegen
En in hetzelfde configuratiebestand application.properties
kunt u ook aangepaste Hibernate-eigenschappen instellen:
# Log SQL statements
spring.jpa.show-sql = false
# Hibernate ddl auto for generating the database schema
spring.jpa.hibernate.ddl-auto = create
# Hibernate database Dialect
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
Dat is het!
Antwoord 9, autoriteit 2%
In spring boot voor jpa java config moet je JpaBaseConfiguration uitbreiden en zijn abstracte methoden implementeren.
@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");
}
}
Antwoord 10, autoriteit 2%
dit gebeurt omdat uw code niet de moeite waard is om verbinding te maken met de database. Zorg ervoor dat u mysql-stuurprogramma en gebruikersnaam en wachtwoord correct hebt.
Antwoord 11, autoriteit 2%
Zorg ervoor dat uw application.properties
alle juiste informatie heeft: (ik heb mijn db-poort gewijzigd van 8889
in 3306
het werkte)
db.url: jdbc:mysql://localhost:3306/test
Antwoord 12, autoriteit 2%
Hier volgen enkele van de redenen waarom het probleem hibernate.dialect
niet is ingesteld.
De meeste van deze uitzonderingen worden weergegeven in het opstartlogboek, dat uiteindelijk wordt gevolgd door het genoemde probleem.
Voorbeeld: In Spring boot-app met Postgres DB
1. Controleer of de database daadwerkelijk is geïnstalleerd en of de server is gestart.
- org.postgresql.util.PSQLException: Verbinding met localhost:5432 geweigerd. Controleer of de hostnaam en poort correct zijn en of de postmaster TCP/IP-verbindingen accepteert.
- java.net.ConnectException: Verbinding geweigerd: verbinden
- org.hibernate.service.spi.ServiceException: kan gevraagde service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment] niet maken
2. Controleer of de databasenaam correct is vermeld.
-
org.postgresql.util.PSQLException: FATAL: database “foo” bestaat niet
In het bestand
application.properties
,spring.datasource.url = jdbc:postgresql://localhost:5432/foo
maar
foo
bestond niet.
Dus ik heb de database gemaakt van pgAdmin voor postgresCREATE DATABASE foo;
3. Controleer of de hostnaam en serverpoort toegankelijk zijn.
- org.postgresql.util.PSQLException: Verbinding met localhost:5431 geweigerd. Controleer of de hostnaam en poort correct zijn en of de postmaster TCP/IP-verbindingen accepteert.
- java.net.ConnectException: Verbinding geweigerd: verbinden
4. Controleer of de databasegegevens correct zijn.
- zoals @Pankaj al zei
-
org.postgresql.util.PSQLException: FATAL: wachtwoordverificatie mislukt voor gebruiker “postgres”
spring.datasource.username= {DB USERNAME HERE}
spring.datasource.password= {DB PASSWORD HERE}
Antwoord 13
In mijn geval kon de gebruiker geen verbinding maken met de database. Als hetzelfde probleem zal optreden als het logboek een waarschuwing bevat net voor de uitzondering:
WARN HHH000342: Could not obtain connection to query metadata : Login failed for user 'my_user'.
Antwoord 14
Zorg ervoor dat je je database in je pom hebt staan, zoals OP deed. Dat was mijn probleem.
Antwoord 15
Mijn probleem was dat de ingesloten database al was verbonden. nauwe verbinding
Antwoord 16
Ik kreeg dit probleem toen Eclipse het JDBC-stuurprogramma niet kon vinden. Moest een geleidelijke verversing van de zonsverduistering doen om dit werk te krijgen.
Antwoord 17
Als je deze regel gebruikt:
sessionFactory.getHibernateProperties().put("hibernate.dialect", env.getProperty("hibernate.dialect"));
zorg ervoor dat env.getProperty("hibernate.dialect")
niet null is.
Antwoord 18
Hetzelfde, maar in een JBoss WildFly AS.
Opgelost met eigenschappen in mijn 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>
Antwoord 19
Voor degenen die met AWS MySQL RDS werken, kan het voorkomen dat u geen verbinding kunt maken met de database. Ga naar de instelling AWS-beveiligingsgroepen voor MySQL RDS en bewerk de inkomende IP-regel door MyIP te vernieuwen.
Ik heb met dit probleem te maken gehad en door het bovenstaande te doen, is het probleem voor mij opgelost.
Antwoord 20
Ik had dit probleem ook. In mijn geval was het omdat er geen subsidies waren toegewezen aan de MySQL-gebruiker. Door subsidies toe te wijzen aan MySQL-gebruiker die mijn app gebruikt, is het probleem opgelost:
grant select, insert, delete, update on my_db.* to 'my_user'@'%';
Antwoord 21
Ik had hetzelfde probleem en na het debuggen bleek dat Spring application.properties een verkeerd IP-adres had voor de DB-server
spring.datasource.url=jdbc:oracle:thin:@WRONG:1521/DEV
Antwoord 22
Het toevoegen van spring.jpa.database-platform=org.hibernate.dialect.MariaDB53Dialect
aan mijn eigenschappenbestand werkte voor mij.
PS: ik gebruik MariaDB
Antwoord 23
Ik heb deze foutmelding in de volgende drie gevallen weergegeven:
- Er bestaat geen databasegebruiker met gebruikersnaam geschreven in het bestand application.properties of persistence.properties of, zoals in uw geval, in het bestand HibernateConfig
- De geïmplementeerde database heeft die gebruiker, maar de gebruiker wordt geïdentificeerd met een ander wachtwoord dan dat in een van de bovenstaande bestanden
- De database heeft die gebruiker en de wachtwoorden komen overeen, maar die gebruiker heeft niet alle rechten die nodig zijn om alle databasetaken uit te voeren die uw spring-boot-app doet
De voor de hand liggende oplossing is om een nieuwe databasegebruiker aan te maken met dezelfde gebruikersnaam en hetzelfde wachtwoord als in de spring-boot-app of de gebruikersnaam en het wachtwoord in uw spring-boot-app-bestanden te wijzigen zodat deze overeenkomen met een bestaande databasegebruiker en voldoende privileges toe te kennen aan die database gebruiker. In het geval van een MySQL-database kan dit als volgt worden gedaan:
mysql -u root -p
>CREATE USER 'theuser'@'localhost' IDENTIFIED BY 'thepassword';
>GRANT ALL ON *.* to theuser@localhost IDENTIFIED BY 'thepassword';
>FLUSH PRIVILEGES;
Natuurlijk zijn er vergelijkbare commando’s in Postgresql, maar ik heb niet getest of in het geval van Postgresql deze foutmelding in deze drie gevallen kan worden gereproduceerd.
Antwoord 24
Het blijkt dat niemand set spring.jpa.database=mysql
vermeldt in het bestand application.properties
, als je Spring JPA gebruikt. Dit is het eenvoudigste antwoord voor mij en ik wil deze vraag delen.
Antwoord 25
Ik had hetzelfde probleem en het werd veroorzaakt doordat ik geen verbinding kon maken met de database-instantie. Zoek naar hibernate-fout HHH000342 in het logboek boven die fout, het zou u een idee moeten geven waar de db-verbinding faalt (onjuiste gebruikersnaam/pas, url, enz.)
Antwoord 26
Dit overkwam mij omdat ik de conf.configure();
niet had toegevoegd voordat ik aan de sessie begon:
Configuration conf = new Configuration();
conf.configure();
Antwoord 27
Zorg ervoor dat u geldige gegevens invoert in application.propertiesen of uw databaseserver beschikbaar is. Als u bijvoorbeeld verbinding maakt met MySQL, controleer dan of XAMPPcorrect werkt.
Antwoord 28
Ik had hetzelfde probleem: de db die ik probeerde te verbinden, bestond niet. Ik gebruikte jpa.database=default
(wat volgens mij betekent dat het zal proberen verbinding te maken met de database en vervolgens automatisch het dialect selecteert). Toen ik de database eenmaal had gestart, werkte het prima zonder enige verandering.
Antwoord 29
Ik heb met dit probleem te maken gehad doordat de Mysql 8.0.11-versie terugging naar 5.7 en voor mij is opgelost
Antwoord 30
Ik had dezelfde fout nadat ik de slaapstandcode-generatie had gebruikt
https://www.mkyong. com/hibernate/hoe-code-genereren-met-hibernate-tools/
toen werd de hibernate.cfg.xml
aangemaakt in /src/main/java
maar zonder de verbindingsparameters
na het verwijderen – mijn probleem was opgelost