web-dev-qa-db-fra.com

Pensez à définir un bean de type 'javax.persistence.EntityManagerFactory' dans votre configuration.

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?

2
foobarfuu

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> {
}

Actor est une classe d'entités JPA et Integer est l'ID/clé primaire et injecter ActorDao dans une classe service impl.

6
ootero

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);
}
0
HL'REB

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;

}
0
Vlad Mihalcea