How do I configure a servlet in Eclipse to use a JPA project?

I am using Eclipse Galileo and I wanted to deploy a simple application using JPA, GlassFish 2.1 and MySQL 5. Unfortunately, I could not find any tutorials for GlassFish 2.1 (3.0 only, but I cannot use it).

I created a JPA project, added a MySQL5 connection and created an Entity from the database.

Generated JPA class:

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;
 }

}

      

And the persistence.xml file:

<?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>

      

I created a dynamic web project and added a new Servlet class that looks like this:

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());
  }

 }

}

      

I have added project references and module dependencies for the JPA project to the servlet project properties. Should there be any other configuration settings? So far, I was able to publish the servlet, but unfortunately I cannot get it to run. http: // localhost: 4848 / ServletProject2 , I get "Hello, World!" post, but if I want to access http: // localhost: 4848 / ServletProject2 / JpaDemoServlet2 I get this exception:

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

      

Is there something I am missing?

+2


source to share


1 answer


I think there are several problems.

First, the persistence.xml looks a little weird, I would expect something like this:

<?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>

      

That is, the provider field and the required fields indicating that you are running on the server (jta-data-source). Of course, jta-data-source must reference the data source you configured in Glassfish.

Next, it seems rather odd to me that your application is running on ports 4848, usually the Glassfish administrative listener, and I expect only the admin console to be there. Have you reconfigured your Glassfish ports?

One thing that puzzles me is how you got this far to this kind of configuration: it looks like Toplink thinks it needs to communicate with Derby running on localhost (port 1527 is the standard for Derby), so maybe there is some other persistence.xml floating around? Please check it.



About the tutorials: I use Glassfish a lot, but always with NetBeans. Here are some links to tutorials from Netbeans site that might help you.

The easiest is to just install Netbeans, follow the tutorials and see all the files that are generated, Netbeans automates the creation of a lot of this stuff, and I don't know how much help Eclipse gives you these files.

Here's a pretty complete tutorial based on Eclipse: http://wiki.eclipse.org/EclipseLink/Examples/JPA/GlassFishV2_Web_Tutorial

Last one: the tutorial for GF3 should get you to go for GF2, at least for these technologies (servlet and JPA). OK, GF3 ships with Eclipselink instead of Toplink Essentials, but the two are not entirely different.

Edit: When I saw TLE trying to connect to Derby on localhost, I forgot about the MySQL part. This has been fixed now - links to how you should start Derby have been removed.

+2


source







All Articles