Java (持久性)无法创建实体管理器

Java (持久性)无法创建实体管理器,java,servlets,jpa,persistence,Java,Servlets,Jpa,Persistence,我有这个问题,这两天我不知道为什么会发生。 我想验证登录名。我的代码: public String Verify(String name, String password) { String admin=""; Query q = emf .createEntityManager() .createQuery( "SELECT u FROM user u where u.name = :name an

我有这个问题,这两天我不知道为什么会发生。 我想验证登录名。我的代码:

public String Verify(String name, String password) {
String admin="";
    Query q = emf
            .createEntityManager()
            .createQuery(
                    "SELECT u FROM user u where u.name = :name and u.password=:password");
    q.setParameter("name", name);
    q.setParameter("password", password);
    User u = (User) q.getSingleResult();

    if (u.getAdmin().equalsIgnoreCase("yes")) {
        admin = "yes";
    } else {
        admin = "no";
    }

    return admin;
}
我得到了这个错误:

java.lang.NullPointerException
at db.DbProcessor.Verify(DbProcessor.java:19)
at controller.VerifikoServlet.doGet(VerifikoServlet.java:25)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)

第19行是“.createEntityManager()”

问题是您尚未初始化
EntityManager工厂。正如我所看到的,您正在Servlet环境中运行


查看此链接,您可能需要阅读以下内容:

我解决了编写此链接以初始化实体工厂管理器的问题:

private static EntityManagerFactory factory = Persistence
        .createEntityManagerFactory("PROJECT_NAME");
EntityManager em = factory.createEntityManager();

如果没有加载持久层,我们可以通过添加以下代码来验证: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 公共类JpaUtil{ 私有静态最终实体管理器工厂emf

static {
    try {
        factory = Persistence.createEntityManagerFactory("MyPu");
    } catch (Throwable ex) {
        logger.error("Initial SessionFactory creation failed", ex);
        throw new ExceptionInInitializerError(ex);
    }
}

}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

请不要这样做。这是获取实体管理器工厂对象的常用工具。但这里重要的是内部的异常处理,即ExceptionInInitializeError

这将清楚地告诉您是否存在与实体类相关的任何问题,例如日期类型变量缺少TemporalType之类的问题

因此,假设您在实体类中使用NamedQuery,但由于实体类中缺少任何类型或必需属性(如日期类型的TemoralType),因此持久性将无法加载它


因此,请确保处理所提到的异常

调试和日志记录总是有帮助的,否则您的
EntityManagerFactory
可能无法初始化。即使您可以拆分代码,您也会看到哪个步骤是空的。我猜是EntityManagerFactory实例化的“emf”在哪里以及如何实例化?看起来它可能是空的。。。您是否正在使用依赖项注入?在这种情况下,它没有多大帮助:)但是我如何初始化它?@PersistenceContex。。私人实体管理工厂emf;是的,我可以得到它,为了进一步解释,我在一个类中使用持久性,然后我从servlet调用这个类方法。我会尝试,我会回应:)