我有一个带有两个实体的Spring Boot-Hibernate应用程序。该应用程序具有一个类,该类实现ApplicationListener接口以在启动时加载一些数据。在此类中,我自动装配了由Spring Boot自动配置的EntityManagerFactory(我假设),并使用它来加载数据,如下所示:
@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作为数据库。