it-swarm.com.ru

Попробуйте определить bean-компонент типа "javax.persistence.EntityManagerFactory" в вашей конфигурации.

Я использую Spring Boot 2.0.0.RC1 (включает Spring Framework 5.0.3.RELEASE), Hibernate 5.2.12.Final, JPA 2.1 API 1.0.0.Final.

У меня есть класс

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);
    }

}

Тогда ошибка

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

Как это исправить?

2
foobarfuu

Если вы включите это:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

Вам не нужно будет автоматически связывать Entity Manager или предоставлять бин Session Factory.

Вам нужно будет только предоставить интерфейсы JpaRepository, такие как:

public interface ActorDao extends JpaRepository<Actor, Integer> {
}

где Actor является классом сущности JPA, а Integer является идентификатором/первичным ключом и внедряет ActorDao в класс service impl.

6
ootero

Ваша конкретная ошибка вызвана аннотацией @Qualifier; Spring ищет Бин с указанным вами конкретным именем, а не ищет Бин типа EntityManagerFactory. Просто удалите аннотацию.

Однако, как только вы исправите это, и поскольку вы также внедряете Бин в метод, который создает SessionFactory, Spring Boot сгенерирует еще одну ошибку, связанную с циклическими зависимостями. Чтобы избежать этого, просто полностью удалите параметр из метода sessionFactory, так как вы уже внедрили EntityManagerFactory в свой класс Config.

Этот код будет работать:

@Bean
public SessionFactory sessionFactory() {
        return emf.unwrap(SessionFactory.class);
}
0
HL'REB

В BeanConfig вы должны внедрить JPA EntityManager через @PersistenceUnit, а не @Autowired.

И удалите getSessionFactory, поскольку Hibernate SessionFactory уже создан внутри, и вы всегда можете развернуть EntityManagerFactory.

Как это:

@Configuration
public class BeanConfig {

    @PersistenceUnit
    EntityManagerFactory emf;

}
0
Vlad Mihalcea