Jakarta ee Servlet不会持久化实体

Jakarta ee Servlet不会持久化实体,jakarta-ee,servlets,jpa,persistence,entitymanager,Jakarta Ee,Servlets,Jpa,Persistence,Entitymanager,我想做什么: 我刚开始学习JPA,因此我想了解从不同角度(应用程序管理、容器管理)持久化实体是如何工作的。应用程序管理工作正常,但是我在使用TestServlet从Web应用程序中使用实体管理器持久化实体时遇到问题 到目前为止我做了什么: IDE:NetBeans 8.0.2 服务器:GlassFish 4.1 Mysql 5.6 JPA 2.1:日食 我已经创建了一个Web应用程序项目 我已经使用NetBeans向导从数据库导入了实体。 由于某些原因,我无法从jdbc/\uu默认值导入它们。

我想做什么:

我刚开始学习JPA,因此我想了解从不同角度(应用程序管理、容器管理)持久化实体是如何工作的。应用程序管理工作正常,但是我在使用TestServlet从Web应用程序中使用实体管理器持久化实体时遇到问题

到目前为止我做了什么:

IDE:NetBeans 8.0.2 服务器:GlassFish 4.1 Mysql 5.6 JPA 2.1:日食

  • 我已经创建了一个Web应用程序项目
  • 我已经使用NetBeans向导从数据库导入了实体。 由于某些原因,我无法从jdbc/\uu默认值导入它们。 我必须创建一个新的数据源。在本例中,它是jdbc/_onlineshop
  • 我只是想在Servlet中创建一个实体,并将其持久化到数据库中,以便在继续之前了解它是如何工作的,但显然我不太了解它

    我连接到数据库,可以通过Java应用程序访问它,但不使用Web容器中的Servlet

    MySQL驱动程序位于类路径主库中

    没有抛出异常。我可以在浏览器中看到这个Servlet。但是,通过RequestDispatcher的重定向也不起作用,浏览器URL保持在web jpa/test

    我的问题:

    由于持久化不起作用,我的Servlet或persistence.xml有什么问题吗

    persistence.xml:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/ persistence" 
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
             http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    
    <persistence-unit name="jpa-webPU" transaction-type="JTA">
     <jta-data-source>jdbc/__onlineshop</jta-data-source>
     <exclude-unlisted-classes>false</exclude-unlisted-classes>
     <properties/>
    </persistence-unit>
    
    谢谢大家!


    p、 s:任何提示都将不胜感激

    最后我找到了一个解决方案:

    try
    {
      ut.begin();
      em.joinTransaction(); // this is necessary, the entitymanager needs to be called specifically
      em.persist(customer);
      ut.commit();
    }
    

    你混淆了重定向和转发。转发只是将处理请求的责任转移给另一个组件。它无法更改URL。重定向(使用HttpServletResponse.sendRedirect())向浏览器发送响应,并告诉浏览器转到另一个URL。这会改变网址。你有什么问题?我已经编辑了这篇文章。基本问题是:我在servlet中持久化实体的方法有什么问题吗?我不明白为什么它不在数据库中持久化实体。如果它没有引发任何异常,那么您的实体可能已经持久化了。确保查看正确的数据库。也就是说,您不应该从servlet使用EM。委托给事务性CDIBean或无状态EJB。使用声明性事务管理,而不是那些可怕的try/catch/commit/rollback块。通过这种方式,您不需要手动从获取实体管理器,也不需要手动处理难看的用户事务和手动回滚。然后您只需要一个
    em.persist(实体)行。只需创建一个类,将其注释为无状态,添加一个PersistenceContext私有EntityManager em字段并添加处理该字段的公共方法。最后通过
    @inject
    将其注入servlet,并让它依次调用一个这样的EJB方法。这就是全部。单个无状态EJB方法调用透明地计数为单个完整事务,其中包含回滚和所有事务。
    try
    {
      ut.begin();
      em.joinTransaction(); // this is necessary, the entitymanager needs to be called specifically
      em.persist(customer);
      ut.commit();
    }