Servlet 不会持久化实体
Servlet does not persist an Entity
我想做什么:
我刚开始使用 JPA,因此我想从不同的角度(应用程序管理、容器管理)了解持久化实体的工作原理。应用程序管理工作正常,但是我在使用 TestServlet 从 Web 应用程序中使用实体管理器持久化实体时遇到问题。
到目前为止我做了什么:
IDE:NetBeans 8.0.2
服务器:GlassFish 4.1
Mysql 5.6
JPA 2.1:EclipseLink
- 我已经创建了一个 Web 应用程序项目。
- 我已经使用 NetBeans 向导从数据库中导入了实体。
出于某种原因,我无法从 jdbc/__default 导入它们。
我必须创建一个新的数据源。在这种情况下是 jdbc/__onlineshop
我只是想在 Servlet 中创建一个实体并将其保存在数据库中,以便在我继续之前了解它是如何工作的,但显然我不太明白。
我已连接到数据库,我可以通过 Java-应用程序访问它,但不能使用 Web 容器中的 Servlet。
MySQL 驱动程序在类路径 MAIN - 库中。
没有抛出异常。 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.: 任何提示不胜感激!
终于找到了解决办法:
try
{
ut.begin();
em.joinTransaction(); // this is necessary, the entitymanager needs to be called specifically
em.persist(customer);
ut.commit();
}
将文件放在显示的结构中。实体可以持久化。它对我有用
我想做什么:
我刚开始使用 JPA,因此我想从不同的角度(应用程序管理、容器管理)了解持久化实体的工作原理。应用程序管理工作正常,但是我在使用 TestServlet 从 Web 应用程序中使用实体管理器持久化实体时遇到问题。
到目前为止我做了什么:
IDE:NetBeans 8.0.2 服务器:GlassFish 4.1 Mysql 5.6 JPA 2.1:EclipseLink
- 我已经创建了一个 Web 应用程序项目。
- 我已经使用 NetBeans 向导从数据库中导入了实体。 出于某种原因,我无法从 jdbc/__default 导入它们。 我必须创建一个新的数据源。在这种情况下是 jdbc/__onlineshop
我只是想在 Servlet 中创建一个实体并将其保存在数据库中,以便在我继续之前了解它是如何工作的,但显然我不太明白。
我已连接到数据库,我可以通过 Java-应用程序访问它,但不能使用 Web 容器中的 Servlet。
MySQL 驱动程序在类路径 MAIN - 库中。
没有抛出异常。 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.: 任何提示不胜感激!
终于找到了解决办法:
try
{
ut.begin();
em.joinTransaction(); // this is necessary, the entitymanager needs to be called specifically
em.persist(customer);
ut.commit();
}
将文件放在显示的结构中。实体可以持久化。它对我有用