NullPointerException Доступ к EntityManagerFactory в приложении Spring Boot Hibernate - PullRequest
0 голосов
/ 03 июля 2019

У меня есть приложение Spring Boot - Hibernate с несколькими сущностями. Приложение имеет класс, который реализует интерфейс ApplicationListener для загрузки некоторых данных при запуске. В этом классе я автоматически подключаю EntityManagerFactory, которая автоматически настраивается Spring Boot (я предполагаю), и использую его для загрузки данных, например:

    @Autowired
    private EntityManagerFactory entityManagerFactory;

    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        EntityManager entityManager = entityManagerFactory.createEntityManager();

        entityManager.getTransaction().begin();
        entityManager.persist(…);
        entityManager.getTransaction().commit();
    }

Это отлично работает, и данные сохраняются в базе данных. В самом приложении у меня есть класс Service, где я пытаюсь выполнить запрос к базе данных. Однако, когда я автоматически подключаю EntityManagerFactory и пытаюсь использовать его, я получаю исключение NullPointerException:

@Autowired
private EntityManagerFactory entityManagerFactory;

public ConcertEventResponse getEventInfo(ConcertEventRequest request) {
    ConcertEventResponse response = new ConcertEventResponse();

    // Get NullPointerException here!
    EntityManager entityManager = entityManagerFactory.createEntityManager();
    // Get NullPointerException here!

    entityManager.getTransaction().begin();
    String name = request.getArtistName();
    Query query = entityManager.createQuery("select a from Artist a where a.name = :name");
    query.setParameter("name", name);
    Artist artist = (Artist) query.getSingleResult();

    entityManager.getTransaction().commit();
    response.setArtist(artist);

    return response;
}

Класс аннотирован @Service. Я могу использовать инжекцию на основе конструктора, чтобы получить дескриптор EntityManagerFactory, но не понимаю, почему я могу подключить его автоматически в одном месте, а не в другом. Что я делаю неправильно? Я использую H2 в качестве базы данных, если это имеет значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...