当使用CDI 2.0注入Entity Manager时引发错误

问题描述 投票:0回答:1

在下面的代码中,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; 
}

}

cdi
1个回答
0
投票

欢迎使用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不会。

© www.soinside.com 2019 - 2024. All rights reserved.