在下面的代码中,EntityManager
是通过使用CDI 2.0
进行注入的。这段代码抛出,
java.lang.ClassNotFoundException:javax.persistence.EntityManager
@ApplicationScoped
public class PersonDao {
@Inject
private EntityManager entityManager;
/*
* private EntityManagerFactory entityManagerFactory;
*/
public List<Person> getAllPersons()
{
/*
* entityManagerFactory=EntityManagerUtil.getEntityManagerFactory();
* entityManager=entityManagerFactory.createEntityManager();
*/
Query query=entityManager.createQuery("SELECT p FROM PersonEntity p");
List<Person> persons=query.getResultList();
return persons;
}
}
欢迎使用StackOverflow。
我需要对您的情况做出一些假设。我将假设您正在以某种方式使用Java EE,并且您的代码正在应用程序服务器中运行。我对此假设非常有信心,但是肯定可以像上面的代码那样以不同的方式部署代码;如果真是这样,那么我的回答可能不适用。
Java EE在CDI出现之前就进行了依赖注入。嗯,相反,Java EE中的各个规范都有自己的依赖注入风格。 在Java EE应用程序服务器上运行时,在JPA中注入EntityManager
的方式是使用@PersistenceContext
,如下所示:
@PersistenceContext
private EntityManager em;
请注意,缺少@Inject
,直到JPA成为既定规范之后,它才真正进入Java EE领域。
此注入配方将导致JTA事务作用域和同步的EntityManager
被注入到您的@ApplicationScoped
注释的bean中。 CDI bean将容纳它的应用程序范围,但所讨论的EntityManager
不会。