J'utilise Spring Boot 2.0.0.RC1 (il inclut Spring Framework 5.0.3.RELEASE), Hibernate 5.2.12.Final, JPA 2.1 API 1.0.0.Final.
J'ai un cours
package com.example;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.persistence.EntityManagerFactory;
@Configuration
public class BeanConfig {
@Autowired
EntityManagerFactory emf;
@Bean
public SessionFactory sessionFactory(@Qualifier("entityManagerFactory") EntityManagerFactory emf) {
return emf.unwrap(SessionFactory.class);
}
}
Alors erreur
Error
***************************
APPLICATION FAILED TO START
***************************
Description:
Parameter 0 of method sessionFactory in com.example.BeanConfig required a bean of type 'javax.persistence.EntityManagerFactory' that could not be found.
Action:
Consider defining a bean of type 'javax.persistence.EntityManagerFactory' in your configuration.
Process finished with exit code 1
Comment régler ceci?
Si vous incluez ceci:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Vous n'aurez pas à renvoyer automatiquement le Entity Manager
ou à fournir un bean Session Factory
.
Il vous suffira de fournir des interfaces JpaRepository telles que:
public interface ActorDao extends JpaRepository<Actor, Integer> {
}
où Actor
est une classe d'entités JPA
et Integer
est l'ID/clé primaire et injecter ActorDao
dans une classe service
impl.
L'erreur spécifique que vous rencontrez est provoquée par l'annotation @Qualifier
; Spring recherche un haricot portant le nom spécifique que vous avez mentionné, au lieu de rechercher un haricot de type EntityManagerFactory
. Supprimez simplement l'annotation.
Cependant, une fois que vous avez résolu ce problème et que vous injectez également le bean dans la méthode qui construit SessionFactory, Spring Boot générera une autre erreur liée aux dépendances cycliques. Pour éviter cela, supprimez simplement le paramètre de la méthode sessionFactory
, puisque vous avez déjà injecté EntityManagerFactory
dans votre classe de configuration.
Ce code fonctionnera:
@Bean
public SessionFactory sessionFactory() {
return emf.unwrap(SessionFactory.class);
}
Dans BeanConfig
, vous devez injecter le JPA EntityManager
via @PersistenceUnit
et non pas @Autowired
.
Et supprimez la getSessionFactory
puisque Hibernate SessionFactory est déjà créé en interne et vous pouvez toujours décompresser la EntityManagerFactory
.
Comme ça:
@Configuration
public class BeanConfig {
@PersistenceUnit
EntityManagerFactory emf;
}