LoginSignup
5
10

More than 5 years have passed since last update.

EclipseでJPA(Java Persistence API)

Last updated at Posted at 2018-05-20

はじめに

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は無視される。
5
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
10