J'essaie de lancer une application Spring-Boot utilisant hibernate via spring-jpa, mais j'obtiens l'erreur
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
mon fichier pom.xml est le suivant:
<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>
ma configuration hibernate est que (la configuration du dialecte est dans la dernière méthode de cette classe):
@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");
}
};
}
}
qu'est-ce que je fais mal ici?
Commencez par supprimer toute votre configuration. Spring Boot le démarrera pour vous. Si vous avez vraiment besoin de SessionFactory
au lieu de EntityManagerFactory
, ajoutez HibernateJpaSessionFactoryBean
.
Assurez-vous que vous avez un application.properties
dans votre chemin de classe et ajoutez les propriétés suivantes.
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
Si vous avez vraiment besoin d'accéder à un SessionFactory
et qu'il s'agit essentiellement de la même source de données, vous pouvez procéder comme suit (qui est également documenté ici bien que pour XML, pas JavaConfig).
@Configuration
public class HibernateConfig {
@Bean
public HibernateJpaSessionFactoryBean sessionFactory(EntityManagerFactory emf) {
HibernateJpaSessionFactoryBean factory = new HibernateJpaSessionFactoryBean();
factory.setEntityManagerFactory(emf);
return factory;
}
}
De cette façon, vous avez à la fois un EntityManagerFactory
et un SessionFactory
.
En supposant que vous ayez une classe avec une méthode main
avec @EnableAutoConfiguration
, vous n'avez pas besoin de l'annotation @EnableTransactionManagement
car celle-ci sera activée par Spring Boot pour vous. Une classe d'application de base dans le package com.spring.app
devrait suffire.
@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args);
}
}
Quelque chose comme ça devrait suffire à faire détecter toutes vos classes (y compris les entités et les référentiels Spring Data).
Je suggérerais également de supprimer la dépendance commons-dbcp
car cela permettrait à Spring Boot de configurer une implémentation plus rapide et plus robuste HikariCP
.
Je rencontrais un problème similaire lors du démarrage de l'application (à l'aide de Spring Boot) avec le serveur de base de données indisponible .
Hibernate peut déterminer le bon dialecte à utiliser automatiquement, mais pour ce faire, une connexion directe à la base de données est nécessaire.
J'ai eu cette erreur quand ma base de données n'a pas été créée. Après avoir créé la base de données manuellement, cela a bien fonctionné.
J'ai également fait face à un problème similaire. Mais, cela était dû au mot de passe invalide fourni. En outre, je voudrais dire que votre code semble être un code de style ancien utilisant le printemps. Vous avez déjà mentionné que vous utilisez un système de démarrage à ressort, ce qui signifie que la plupart des choses seront configurées automatiquement pour vous. Le dialecte hibernate sera automatiquement sélectionné en fonction du pilote de base de données disponible sur le chemin de classe, ainsi que des informations d'identification valides pouvant être utilisées pour tester correctement la connexion. S'il y a un problème avec la connexion, vous rencontrerez encore la même erreur. seulement 3 propriétés nécessaires dans 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=
ajouter spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQLDialect
dans le fichier application.properties
J'ai rencontré le même problème et mon problème était que la base de données à laquelle je tentais de me connecter n'existait pas.
J'ai créé la base de données, vérifié l'URL/chaîne de connexion et reran et tout a fonctionné comme prévu.
Assurez-vous que votre application.properties
a toutes les informations correctes: (j'ai changé mon port de base de données de 8889
à 3306
cela a fonctionné)
db.url: jdbc:mysql://localhost:3306/test
cela se produit parce que votre code n'est pas capable de connecter la base de données. Assurez-vous que vous avez le pilote mysql et nom d'utilisateur, mot de passe correct.
Assurez-vous d'avoir votre base de données dans votre pom, comme OP. C'était mon problème.
Dans mon cas, l'utilisateur n'a pas pu se connecter à la base de données. Si aura le même problème si le journal contient un avertissement juste avant l'exception:
WARN HHH000342: Could not obtain connection to query metadata : Login failed for user 'my_user'.
Mon problème était que la base de données intégrée était déjà connectée. fermer la connexion
J'ai eu ce problème quand Eclipse n'a pas pu trouver le pilote JDBC. Je devais faire un rafraichissement de l’éclipse pour obtenir ce travail.
Au printemps, démarrez jpa Java config pour étendre JpaBaseConfiguration et implémenter ses méthodes abstraites.
@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");
}
}
J'ai aussi eu ce problème. Dans mon cas, c'était parce qu'aucune subvention n'avait été attribuée à un utilisateur de MySQL. L'attribution aux utilisateurs de MySQL des autorisations que mon application utilise a résolu le problème:
grant select, insert, delete, update on my_db.* to 'my_user'@'%';
Cela m'est arrivé parce que je n'avais pas ajouté la conf.configure();
avant de commencer la session:
Configuration conf = new Configuration();
conf.configure();
J'ai rencontré le même problème: la base de données que j'essayais de connecter n'existait pas. J'ai utilisé jpa.database=default
(ce qui, je suppose, signifie qu'il essaiera de se connecter à la base de données puis de sélectionner automatiquement le dialecte). Une fois que j'ai démarré la base de données, cela a fonctionné sans aucun changement.
Si l'erreur précédente dans le journal était la suivante: "ERREUR - HikariPool-1 - jdbcUrl est requis avec driverClassName" Dans ce cas, la solution consiste à réécrire "url" en "jdbc-url", comme suit: Base de données application.yml pour le démarrage Spring à partir de applications.properties
J'ai eu la même erreur après avoir utilisé la génération de code Hibernate
https://www.mkyong.com/hibernate/how-to-generate-code-with-hibernate-tools/
alors le hibernate.cfg.xml
a été créé dans le /src/main/Java
.__, mais sans les paramètres de connexion .__ après l'avoir supprimé - mon problème a été résolu
J'ai eu le même problème et cela était dû à l'impossibilité de se connecter à l'instance de base de données. Recherchez l'erreur d'hibernation HHH000342 dans le journal au-dessus de cette erreur, elle devrait vous donner une idée de l'endroit où la connexion à la base de données échoue (nom d'utilisateur/mot de passe incorrect, adresse URL, etc.).
Pour ceux qui travaillent avec AWS MySQL RDS, cela peut se produire lorsque vous ne pouvez pas vous connecter à la base de données. Accédez au paramètre AWS Security Groups pour MySQL RDS et modifiez la règle IP entrante en actualisant MyIP.
J'ai fait face à ce problème et ce qui précède a résolu le problème pour moi.
Assurez-vous que vous avez entré des détails valides dansapplication.propertieset que votre serveur de base de données est disponible. Par exemple, lorsque vous vous connectez avec MySQL, vérifiez siXAMPPfonctionne correctement.
Idem mais dans un JBoss WildFly AS .
Résolu avec les propriétés dans mon 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>
J'ai eu la même erreur,
Caused by: org.hibernate.HibernateException: Access to DialectResolutionInfo cannot be null when 'hibernate.dialect' not set
dans mon cas, le WAR avait application.properties à l'intérieur du serveur de développement
où application externe.properties pointait vers le bon serveur de base de données.
assurez-vous que vous n'avez pas d'autre application.properties dans le classpath/jars ...
Si vous utilisez cette ligne:
sessionFactory.getHibernateProperties().put("hibernate.dialect", env.getProperty("hibernate.dialect"));
assurez-vous que env.getProperty("hibernate.dialect")
n'est pas nul.
J'ai fait face à ce problème en raison de la version Mys.11 8.0.11 qui est revenue à la version 5.7 résolue pour moi
J'ai eu le même problème et après le débogage, il s'est avéré que Spring application.properties avait une adresse IP incorrecte pour le serveur de base de données.
spring.datasource.url=jdbc:Oracle:thin:@WRONG:1521/DEV