2015-02-08 182 views
0

怎麼做我想做的事:servlet沒有堅持實體

我剛開始使用JPA,因此我希望瞭解如何從不同的角度工作堅持實體來說(應用程序管理,容器管理)。應用程序管理工作正常,但是我遇到問題,使用TestServlet從Web應用程序中使用實體管理器持久化實體。

我有什麼迄今所做的:

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

  1. 我創建了一個Web應用程序項目。
  2. 我使用NetBeans嚮導從數據庫導入了實體。 由於某些原因,我無法從jdbc/__ default導入它們。 我必須創建一個新的數據源。在這種情況下,它是爲jdbc/__網上商店

我只是想一個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 protected]"); 
    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 .:任何暗示讚賞!

+0

你是混亂的重定向和轉發。轉發只是將處理請求的責任轉移給其他組件。它無法更改網址。重定向(使用HttpServletResponse.sendRedirect())向瀏覽器發送響應並告訴它轉到另一個URL。這可以更改網址。 – 2015-02-08 17:41:54

+0

你的問題是什麼? – 2015-02-08 17:42:00

+0

我已編輯帖子。基本的問題是:我是如何接近在servlet中持久化一個實體的?我不明白爲什麼它不會將數據庫中的實體持久化。 – SklogW 2015-02-08 17:45:11

回答

0

最後我找到了解決辦法:

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