Servlet不会持久化实体

时间:2015-02-08 17:39:06

标签: java-ee servlets jpa persistence entitymanager

我想做什么:

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

到目前为止我做了什么:

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

  1. 我创建了一个Web应用程序项目。
  2. 我使用NetBeans向导从数据库导入了实体。 由于某种原因,我无法从jdbc / __ default导入它们。 我必须创建一个新的数据源。在这种情况下,它是jdbc / __ onlineshop
  3. 我只是想在Servlet中创建一个实体,并将其保存在数据库中,只是为了了解它如何工作,然后继续前进,但显然我不太明白。

    我连接到数据库,我可以通过Java-Application访问它,但不能使用Web容器中的Servlet。

    MySQL驱动程序位于类路径MAIN - Libraries。

    不会抛出异常。调用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>
    

    TestServlet.java:

    package jpa;
    
    import java.io.IOException;
    import javax.annotation.Resource;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.PersistenceUnit;
    import javax.servlet.RequestDispatcher;
    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.transaction.UserTransaction;
    
    @WebServlet("/test")
    public class TestServlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
    
    @PersistenceUnit
    EntityManagerFactory emf;
    
    @Resource
    private UserTransaction ut;
    
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    
    
        EntityManager em = emf.createEntityManager();
    
        Customer customer = new Customer();
    
        customer.setEmail("email@test.com");
        customer.setPassword("password");
    
        try 
        {
            ut.begin();
            em.persist(customer);
            ut.commit();
    
        } catch (Exception e) {
    
            try 
            {
                ut.rollback();
    
            } catch (Exception e1) 
            {
                e1.printStackTrace();
            }
    
            throw new ServletException(e.getMessage());
    
        }finally
        {
            em.close();
        }
    
        RequestDispatcher dispatcher = request.getRequestDispatcher    ("index.html");
        dispatcher.forward(request, response);
    
    }
    }
    

    谢谢!

    p.s:感谢任何提示!

1 个答案:

答案 0 :(得分:1)

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

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