使用Java EE保留我的第一个实体

时间:2014-04-08 14:50:04

标签: java java-ee servlets jpa

试图了解Java EE(ORM / Entities / Annotations / EJB / Servlets等)。所以我创建了一个非常简单的网页,您可以在其中输入用户信息并将其发送到服务器。我使用Apache Tomcat 8.0作为webbserver应用程序,这里是持久化实体所需的应用程序文件和内容的所有相关部分:

http://pastebin.com/fwfbnYpU

该应用程序在第99行给出了错误说:

08-Apr-2014 16:18:10.329 SEVERE [http-nio-8084-exec-93] org.apache.catalina.core.StandardWrapperValve.invoke Servlet.service() for servlet [indexServlet] in context with path [/JavaEENackademin] threw exception

java.lang.NullPointerException

我做错了什么?数据库存在正确的命名表和列名。但话说回来这不是问题,也许在解决这个问题后它会成为一个问题:)

2 个答案:

答案 0 :(得分:1)

您的代码的一个问题是您不应该将EntityManager注入servlet。 Servlet通常是单例,因此所有servlet都使用相同的EntityManager。您应该注入一个EntityManagerFactory,然后从中获取EntityManager。您还必须处理交易。不确定这是否会引起您的问题,但是应该修复一些问题。

答案 1 :(得分:0)

我很惊讶您能够在您的pastebin中部署代码。特别是:

@WebServlet(name = "indexServlet", urlPatterns = {"/indexServlet"})
public class indexServlet extends HttpServlet {

    @Inject
    LoginValidation validation;
    @PersistenceContext(unitName = "JavaEENackademinPU")
    private EntityManager em;

    //... offending line 99 calls: em.persist()
}

PersistenceContextInject都不是servlet规范的一部分,因此您可能会在安装中添加其他jar。

但是您将persistence.xml配置为使用servlet环境中几乎不支持的JTA事务,可能导致tomcat完全忽略@PersistenceContext注释并保留em == null(默认值)

我发现this link描述了一个集成,但它看起来很复杂,需要编辑内部xml文件,然后继续使用Spring。对于初学者来说,可能每一部分都是过度的。

我建议您重新开始使用TomEE的副本,该副本已经完成所有连接,以便为您提供支持CDI(@Inject)和JPA(@PersistenceContext)的完全成熟的应用程序服务器开箱即用。