2015-02-08 4 views
0

Что я хочу сделать:Servlet не сохраняется Субъект

Я только начал с JPA, и поэтому я хочу, чтобы понять, как сохраняющиеся Entitys из разных работ перспективы (Application-Managed, Container-Managed). Управление приложениями отлично работает, однако у меня возникают проблемы с сохранением Entity с Менеджером Entity из веб-приложения с помощью TestServlet.

Что я сделал до сих пор:

IDE: NetBeans 8.0.2 Сервер: GlassFish 4,1 Mysql 5,6 JPA 2.1: EclipseLink

  1. Я создал проект веб-приложения ,
  2. Я импортировал объекты из базы данных с помощью мастера NetBeans. По какой-то причине я не могу импортировать их из jdbc/__ default. Мне нужно создать новый источник данных. В данном случае это был JDBC/__ Onlineshop

Я просто хочу, чтобы создать объект в пределах Servlet и сохраняются в базу данных только, чтобы понять, как это работает, прежде чем я продолжу, но, видимо, я не совсем понимаю.

Я подключен к базе данных, и я могу получить к нему доступ через Java-приложение, но не используя сервлет из веб-контейнера.

Драйвер MySQL находится в GLAP-библиотеках классов.

Исключения не выбрасываются. Вызывается сервлет, который я могу видеть в браузере. Однако перенаправление через 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

Ты путаешь редирект и вперед. Переадресация просто передает ответственность за обработку запроса другому компоненту. Он не может изменить URL. Переадресация (с использованием HttpServletResponse.sendRedirect()) отправляет ответ браузеру и сообщает ему перейти к другому URL-адресу. Это может изменить URL. –

+0

Каков ваш вопрос? –

+0

Я отредактировал сообщение. Основной вопрос был бы: Есть ли что-то неправильное в том, как я обращался к существующей сущности внутри сервлета?Я не понимаю, почему он не сохраняет Entity в базе данных. – SklogW

ответ

0

Наконец я нашел решение:

try 
{ 
    ut.begin(); 
    em.joinTransaction(); // this is necessary, the entitymanager needs to be called specifically 
    em.persist(customer); 
    ut.commit(); 
} 
Смежные вопросы