Как настроить сервлет в Eclipse для использования проекта JPA? - PullRequest
2 голосов
/ 25 октября 2009

Я использую Eclipse Galileo, и я хотел развернуть простое приложение, используя JPA, GlassFish 2.1 и MySQL 5. К сожалению, я не смог найти никаких руководств по GlassFish 2.1 (только для 3.0, но я не могу его использовать).

Я создал проект JPA, добавил соединение MySQL5 и сгенерировал Entity из базы данных.

Генерировать класс JPA:

package model;

import java.io.Serializable;
import javax.persistence.*;

@Entity
@Table(name="customer")
public class Customer implements Serializable {
 private static final long serialVersionUID = 1L;

 @Id
 @Column(name="customer_id")
 private int customerId;

 private String email;

 @Column(name="first_name")
 private String firstName;

 @Column(name="last_name")
 private String lastName;

    public Customer() {
    }

 public int getCustomerId() {
  return this.customerId;
 }

 public void setCustomerId(int customerId) {
  this.customerId = customerId;
 }

 public String getEmail() {
  return this.email;
 }

 public void setEmail(String email) {
  this.email = email;
 }

 public String getFirstName() {
  return this.firstName;
 }

 public void setFirstName(String firstName) {
  this.firstName = firstName;
 }

 public String getLastName() {
  return this.lastName;
 }

 public void setLastName(String lastName) {
  this.lastName = lastName;
 }

}

И файл persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
 <persistence-unit name="JPAProject2">
  <class>model.Customer</class>
 </persistence-unit>
</persistence>

Я создал динамический веб-проект и добавил новый класс сервлетов, который выглядит следующим образом:

package servlet;    
import java.io.IOException;    
import javax.annotation.Resource;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.PersistenceUnit;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.transaction.UserTransaction;    
import model.Customer;

public class JpaDemoServlet2 extends HttpServlet 
{
 private static final long serialVersionUID = 1L;

 @PersistenceUnit
 private EntityManagerFactory entityManagerFactory;
 @Resource
 private UserTransaction userTransaction;

    public JpaDemoServlet2() 
    {
        super();
    }

 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
 {
  EntityManager entityManager =
   entityManagerFactory.createEntityManager();

  Customer customer = new Customer();
  customer.setCustomerId(3);
  customer.setFirstName("Smith");
  customer.setLastName("John");
  customer.setEmail("john.smith@email.com");

  try
  {
   userTransaction.begin();
   entityManager.persist(customer);  
   userTransaction.commit();
  }
  catch(Exception ex)
  {
   response.sendError(1, ex.getMessage());
  }

 }

}

Я добавил в свойства проекта сервлета Ссылки проекта и Зависимости модуля для проекта JPA. Существуют ли другие параметры конфигурации, которые необходимо выполнить? Пока мне удалось опубликовать сервлет, но, к сожалению, я не могу его запустить. http://localhost:4848/ServletProject2, Я получаю «Привет, мир!» сообщение, но если я хочу получить доступ к http://localhost:4848/ServletProject2/JpaDemoServlet2, я получаю следующее исключение:

Exception [TOPLINK-4002] (Oracle TopLink Essentials - 2.1 (Build b60e-fcs (12/23/2008))): oracle.toplink.essentials.exceptions.DatabaseException
Internal Exception: java.sql.SQLException: Error in allocating a connection. Cause: Connection could not be allocated because: java.net.ConnectException : Error connecting to server localhost on port 1527 with message Connection refused: connect.
Error Code: 0

Что-то мне не хватает?

1 Ответ

2 голосов
/ 26 октября 2009

Я думаю, что есть ряд проблем.

Во-первых, файл persistence.xml выглядит немного странно, я бы ожидал что-то вроде этого:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="JPAProject2" transaction-type="JTA">
    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
    <jta-data-source>jdbc/sample</jta-data-source>
    <class>model.Customer</class>
</persistence-unit>
</persistence>

То есть поле провайдера и поля, необходимые для указания того, что вы работаете на сервере (jta-data-source). Конечно, jta-data-source должен ссылаться на источник данных, который вы настроили в Glassfish.

Далее, я думаю, довольно странно, что ваше приложение работает на портах 4848, обычно это административный приемник Glassfish, и я ожидаю, что там будет работать только консоль администратора. Вы перенастроили порты вашего Glassfish?

Одна вещь, которая озадачивает меня, это то, как вы продвинулись так далеко с такой конфигурацией: похоже, что Toplink считает, что должен связаться с Derby, работающим на localhost (порт 1527 является стандартным для Derby), поэтому, возможно, есть еще какой-то другой файл persistence.xml плавать вокруг? Пожалуйста, проверьте это.

Об учебных пособиях: я часто использую Glassfish, но всегда с NetBeans. Вот несколько ссылок на учебники с сайта Netbeans, они могут вам помочь.

Может быть, проще всего установить Netbeans, следовать учебным курсам и просмотреть все файлы, которые генерируются, Netbeans автоматизирует создание многих этих вещей, и я не знаю, какую степень помощи Eclipse дает вам эти файлы.

Вот довольно полное руководство на основе Eclipse: http://wiki.eclipse.org/EclipseLink/Examples/JPA/GlassFishV2_Web_Tutorial

Последнее: учебник по GF3 должен помочь вам освоить GF2, по крайней мере, для этих технологий (сервлет и JPA). Хорошо, GF3 поставляется с Eclipselink вместо Toplink Essentials, но эти два совсем не отличаются.

Редактировать: когда я увидел, что TLE пытается подключиться к Derby на localhost, я забыл часть о MySQL. Это было исправлено - ссылки на то, как начать Дерби, были удалены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...