Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA实体管理器工厂注入失败(JPA 2、Eclipselink、J2EE 6)_Java_Jpa_Glassfish_Eclipselink - Fatal编程技术网

Java JPA实体管理器工厂注入失败(JPA 2、Eclipselink、J2EE 6)

Java JPA实体管理器工厂注入失败(JPA 2、Eclipselink、J2EE 6),java,jpa,glassfish,eclipselink,Java,Jpa,Glassfish,Eclipselink,我正在尝试启动并运行一个小示例web应用程序,但在实体管理器工厂中遇到了一个问题 我的persistence.xml如下所示 <persistence version="2.0" xmlns=" http://java.sun.com/xml/ns/persistene" xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.c

我正在尝试启动并运行一个小示例web应用程序,但在实体管理器工厂中遇到了一个问题

我的persistence.xml如下所示

<persistence version="2.0" xmlns=" http://java.sun.com/xml/ns/persistene"
         xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence ttp://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
<persistence-unit name="main" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <jta-data-source>jdbc/Maindb</jta-data-source>
    <properties>
        <property name="eclipselink.ddl-generation" value="drop-and-create-tables" /> 
        <property name="eclipselink.ddl-generation.output-mode" value="database" /> 
    </properties>
</persistence-unit>
并通过以下代码查询持久层

EntityManager em = emf.createEntityManager();
Customer customer = (Customer) em.find(Customer.class, customerID);
这项工作没有任何问题(我知道),我得到了预期返回的数据

ItemResource对象对相同的持久化单元执行相同的操作

@PersistenceUnit(unitName="main")
private EntityManagerFactory emf;
但是注入失败,emf总是空的

EntityManager em = emf.createEntityManager(); <- emf is null here

EntityManager em=emf.createEntityManager() 我不确定这是否能回答这个问题(为什么第二种情况下EMF
null
),但既然您使用的是应用程序管理的实体管理器,那么您是否正确地关闭了
EntityManager
?大概是这样的:

public class LoginServlet extends HttpServlet {
    @PersistenceUnit(unitName="EmployeeService")
    EntityManagerFactory emf;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
        String userId = request.getParameter("user");
        // check valid user
        EntityManager em = emf.createEntityManager();
        try {
            User user = em.find(User.class, userId);
            if (user == null) {
                // return error page
                // ...
            }
        } finally {
            em.close();
    }
}
但是,老实说,我真的很想知道为什么不使用容器管理的实体管理器。在我看来,让容器管理其生命周期要简单得多。要获得
EntityManager
,请执行以下操作:

@PersistenceContext(unitName = "main")
private EntityManager em;

ItemResource类是EJB、servlet还是托管bean?我认为@PersistenceUnit只能保证在EJB容器管理的对象上工作。不过,我可能弄错了。CustomerResource和ItemResource EJB都是某种类型的吗?如果您不确定,可以显示类定义。@Dan,注释适用于所有容器管理的对象(servlet和EJB容器都符合此定义)。EJB就是这样一种托管对象。这些类实现javax.xml.ws.Provider,并以@webserviceprovider命名。我认为您应该试试Pascal的建议,即注入EntityManager而不是EntityManagerFactory。WebServiceProvider批注似乎是容器可以识别的批注之一,应该注入依赖项。我尝试注入实体管理器,但收到了相同的错误。@mb789845:能否显示服务器日志中的堆栈跟踪?日志文件中没有引发异常(正在检查空指针)。我已更新到question post,以包含日志条目和更多代码,谢谢。@mb789845:如果您发布一些代码,允许复制您的案例(理想情况下,您可以将war上载到某个地方),可能会发生这种情况我可以进一步调查这个问题。以目前的详细程度,我认为这是不可能的。我已经用这个孤立的问题更新了主要描述,如果你想让我发送项目,我仍然很乐意这样做。谢谢
<?xml version="1.0" encoding="UTF-8"?>
<endpoints xmlns="http://java.sun.com/xml/ns/jax-ws/ri/runtime" version="2.0">
    <endpoint name="Item" implementation="com.test.item.ItemResource" url-pattern="/Item/*" />
    <endpoint name="Customer" implementation="com.test.customer.CustomerResource" url-pattern="/Customer" />
</endpoints>
public class LoginServlet extends HttpServlet {
    @PersistenceUnit(unitName="EmployeeService")
    EntityManagerFactory emf;

    protected void doPost(HttpServletRequest request, HttpServletResponse response) {
        String userId = request.getParameter("user");
        // check valid user
        EntityManager em = emf.createEntityManager();
        try {
            User user = em.find(User.class, userId);
            if (user == null) {
                // return error page
                // ...
            }
        } finally {
            em.close();
    }
}
@PersistenceContext(unitName = "main")
private EntityManager em;