Java
Eclipse
PostgreSQL
jpa

EclipseでJPA(Java Persistence API)

はじめに

JPAのサンプルプログラムをEclipseで作ってみます。
MVCプログラムを改造し、JPAを使ってPostgre SQLのDBからデータを取得します。
あらかじめEmplyeeテーブルを作成しておきます。(参照:Postgre SQLをインストールする)

開発環境

Windows 10 Pro 1709(16299.192)
Eclipse pleiades-4.7.3
java 1.8.0_162
PostgreSQL 10.4 Released!

手順

1.PostgreSQL JDBC Driver のダウンロード

2.プロジェクトのWEB-INF\libにコピー

3.Postgres SQLへの接続作成

4.JPAプロジェクトへ変換

5.ソースコードの変更

6.動作確認

1.PostgreSQL JDBC Driver のダウンロード

URL

https://jdbc.postgresql.org/download.html

1. 「PostgreSQL JDBC 4.2 Driver, 42.2.2」クリック

image.png

2.プロジェクトのWEB-INF\libにコピー

image.png

3.Postgres SQLへの接続作成

1. 「ウィンドウ」 -> 「ビューの表示」 -> 「その他」メニュー選択

image.png

2. 「データ管理」「データ・ソース・エクスプローラー」を選択し、「開く」をクリック

image.png

3. 「データソース接続」上で右メニュー、「新規」をクリック

image.png

4. 「Postgres SQL」を選択し、「次へ」をクリック

image.png

5. 「データベース」「URL」「ユーザ名」「パスワード」を入力し、「接続のテスト」をクリック

6. 「Pingが正常に完了しました」を確認し、「OK」ボタンをクリック

7. 「完了」ボタンをクリック

image.png

8. Postgre SQLをインストールするで作成したテーブルが確認できる

image.png

4.JPAプロジェクトへ変換

1. プロジェクト上で右メニュ -> 構成 -> JPAプロジェクトへ変換を選択

image.png

2. 「次へ」クリック

image.png

3. 「EclipseLink 2.5.2」を選択し、「次へ」クリック

image.png

4. 「このライセンスの条項に受託」をチェックし、「完了」クリック

image.png

5. 「新規 PostgreSQL」の接続を選択し、「ビルド・パス」「接続からデフォルト・カタログを上書き」「接続からデフォルト・スキーマをオーバーライド」をチェックし、「完了」クリック

image.png

6. プロジェクト上で右メニュ -> JPAツール -> テーブルからエンティティーを生成を選択

image.png

7. 「employee」テーブルにチェックし、「完了」クリック

image.png

5.ソースコードの変更

1. Employee Entityに、findByIdの@NamedQuery を追加

変更前

@Entity
@NamedQuery(name="Employee.findAll", query="SELECT e FROM Employee e")
public class Employee implements Serializable {
変更後

@Entity
@NamedQueries({
    @NamedQuery(name="Employee.findAll", query="SELECT e FROM Employee e"),
    @NamedQuery(name = "Employee.findById", query = "SELECT e from Employee e where e.id = :id")
})
public class Employee implements Serializable {

2. EmployeeServletを、DBから取得するよう変更

変更後

package emp;

import java.io.IOException;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
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 model.Employee;


/**
 * Servlet implementation class EmployeeServlet
 */
@WebServlet(name = "EmpList", urlPatterns = { "/EmpList" })
public class EmployeeServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public EmployeeServlet() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("SampleMVC2");
        EntityManager entityManager = emf.createEntityManager();

        List<Employee> employeeList = entityManager
                .createNamedQuery("Employee.findAll", Employee.class)
                .getResultList();

        entityManager.close();
        emf.close();


        // ViewへModelデータを渡す
        request.setAttribute("employeeList", employeeList);

        // Viewを表示
        this.getServletContext()
            .getRequestDispatcher("/employeeList.jsp")
            .forward(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("SampleMVC2");
        EntityManager entityManager = emf.createEntityManager();

        List<Employee> employeeList;

        String id = request.getParameter("id");

        if (id.isEmpty()) {
            employeeList = entityManager
                    .createNamedQuery("Employee.findAll", Employee.class)
                    .getResultList();
        }
        else {
            employeeList = entityManager
                    .createNamedQuery("Employee.findById", Employee.class)
                    .setParameter("id", id)
                    .getResultList();
        }

        entityManager.close();
        emf.close();

        // ViewへModelデータを渡す
        request.setAttribute("employeeList", employeeList);


        // Viewを表示
        this.getServletContext()
            .getRequestDispatcher("/employeeList.jsp")
            .forward(request, response);

    }

}

3. EmployeeBean上で右メニュー -> 「削除」選択

image.png

4. 「OK」選択

image.png

5. 「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="SampleMVC">
        <class>model.Employee</class>
    </persistence-unit>
</persistence>
変更後(DB接続情報追加)

<?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="SampleMVC2">
        <class>model.Employee</class>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /> <!-- DB Driver -->
            <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/postgres" /> <!-- BD Mane -->
            <property name="javax.persistence.jdbc.user" value="postgres" /> <!-- DB User -->
            <property name="javax.persistence.jdbc.password" value="dev" /> <!-- DB Password -->
        </properties>
    </persistence-unit>
</persistence>

6.動作確認

「Eclipse で MVC.」の動作確認参照

おわりに

  • EntityManagerにアノテーション@PersistenceContextを付与できるのは、トランザクション管理(コンテナ管理)されているときのみ。そうでない場合は@PersistenceContextは無視される。
  • 4.JPAプロジェクトへ変換
  • 5.ソースコードの変更
  • 6.動作確認
  • おわりに