JPAプロジェクトを使用するようにEclipseでサーブレットを構成するにはどうすればよいですか?
質問
Eclipse Galileoを使用していますが、JPA、GlassFish 2.1、MySQL 5を使用した簡単なアプリケーションをデプロイしたかったのですが、残念ながらGlassFish 2.1のチュートリアルは見つかりませんでした(3.0のみですが、使用できません)。
JPAプロジェクトを作成し、MySQL5接続を追加して、データベースからエンティティを生成しました。
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>
動的Webプロジェクトを作成し、次のような新しいサーブレットクラスを追加しました。
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 、「Hello、World!」メッセージ、しかし 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
不足しているものはありますか?
解決
多くの問題があると思います。
最初に、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のポートを再設定しましたか?
私を困惑させることの1つは、このような構成でこれまでにどのように得られたかです.Toplinkは、localhostで実行されているDerby(Derbyのポート1527が標準です)に接続する必要があると考えているため、他のpersistence.xmlがまだ残っている可能性があります浮かんでいる?確認してください。
チュートリアルについて:Glassfishを頻繁に使用していますが、常にNetBeansを使用しています。 Netbeansサイトからのチュートリアルへのリンクがいくつかあります。それらはあなたを助けるかもしれません。
- http://www.netbeans.org/kb/docs /web/customer-book.html
- http://www.netbeans.org/kb/61/javaee /persistence.html
Netbeansをインストールし、チュートリアルに従い、生成されるすべてのファイルを確認するのが最も簡単な場合があります。Netbeansはこれらの多くの作成を自動化し、Eclipseがどの程度の支援を提供するのかわかりませんこれらのファイル。
Eclipseベースのかなり完全なチュートリアル: http://wiki.eclipse .org / EclipseLink / Examples / JPA / GlassFishV2_Web_Tutorial
最後の1つ:少なくともこれらの技術(サーブレットおよびJPA)については、GF3のチュートリアルでGF2についても説明します。 GF3にはToplink Essentialsの代わりにEclipselinkが付属していますが、これら2つはそれほど違いはありません。
編集:localhostのDerbyに接続しようとするTLEを見たとき、MySQLの一部を忘れていました。これは現在修正されています-Derbyの起動方法への参照は削除されました。