У меня есть приложение 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 в качестве базы данных, если это имеет значение.