はじめに
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」クリック
2.プロジェクトのWEB-INF\libにコピー
3.Postgres SQLへの接続作成
1. 「ウィンドウ」 -> 「ビューの表示」 -> 「その他」メニュー選択
2. 「データ管理」「データ・ソース・エクスプローラー」を選択し、「開く」をクリック
3. 「データソース接続」上で右メニュー、「新規」をクリック
4. 「Postgres SQL」を選択し、「次へ」をクリック
5. 「データベース」「URL」「ユーザ名」「パスワード」を入力し、「接続のテスト」をクリック
6. 「Pingが正常に完了しました」を確認し、「OK」ボタンをクリック
7. 「完了」ボタンをクリック
8. Postgre SQLをインストールするで作成したテーブルが確認できる
4.JPAプロジェクトへ変換
1. プロジェクト上で右メニュ -> 構成 -> JPAプロジェクトへ変換を選択
2. 「次へ」クリック
3. 「EclipseLink 2.5.2」を選択し、「次へ」クリック
4. 「このライセンスの条項に受託」をチェックし、「完了」クリック
5. 「新規 PostgreSQL」の接続を選択し、「ビルド・パス」「接続からデフォルト・カタログを上書き」「接続からデフォルト・スキーマをオーバーライド」をチェックし、「完了」クリック
6. プロジェクト上で右メニュ -> JPAツール -> テーブルからエンティティーを生成を選択
7. 「employee」テーブルにチェックし、「完了」クリック
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上で右メニュー -> 「削除」選択
4. 「OK」選択
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.動作確認
おわりに
- EntityManagerにアノテーション@PersistenceContextを付与できるのは、トランザクション管理(コンテナ管理)されているときのみ。そうでない場合は@PersistenceContextは無視される。