CRUDの基本 (4/5)
作成:2017-10-28 09:35
更新:2017-10-28 09:35
更新:2017-10-28 09:35
■Updateの基本
エンティティの更新(Update)は、いくつかの機能を組み合わせて実現します。その基本的な処理を整理すると以下のようになります。
1. 更新するエンティティを取得する
2. エンティティを書き換える
取得したエンティティのSetterメソッドを呼び出して、フィールドの値を書き換えておきます。MyDataEntityならば、setName、setMail、setTelといったメソッドを用意してありましたね。
3. 更新を行う
エンティティの更新は、persistではなく、このmergeを使うのが基本です。persistは、新しいエンティティを作成するためのもので、mergeは「新しく作ってもいいし、既にあるのを更新してもいい」というような場合に使います。
では、利用例を挙げておきましょう。サンプルのサーブレット(MyDataEntityServletクラス)の実装例を下に掲載しておきました。これは、idパラメータを付けてGETアクセスする(例えば、/hello?id=1 という具合)と、そのエンティティをentityという名前でリクエストに保存します。そしてPOST送信されたなら、送られたパラメータを元にエンティティを更新します。index.jsp側には、このentityの値を取り出してフォームに設定し送信するような仕組みを用意しておけばいいでしょう。
これで、以下のようにアドレス指定してアクセスすると、指定のIDのデータがフォームに設定されます。
そして、そのままフォームの内容を書き換えて送信すれば、そのIDのエンティティが更新されるというわけです。
1. 更新するエンティティを取得する
変数 = manager.find( [class] , 値 );まず、EntityManagerクラスの「find」メソッドを使って、IDを指定して更新するエンティティを取得します。
2. エンティティを書き換える
取得したエンティティのSetterメソッドを呼び出して、フィールドの値を書き換えておきます。MyDataEntityならば、setName、setMail、setTelといったメソッドを用意してありましたね。
3. 更新を行う
manager.getTransaction().begin();トランザクションをスタートし、そこでEntityManagerの「merge」というメソッドを実行します。これは、引数に指定したエンティティをデータベースのテーブルにマージする(既にあるレコードに合成する)ものです。
manager.merge(……エンティティ……);
manager.getTransaction().commit();
エンティティの更新は、persistではなく、このmergeを使うのが基本です。persistは、新しいエンティティを作成するためのもので、mergeは「新しく作ってもいいし、既にあるのを更新してもいい」というような場合に使います。
では、利用例を挙げておきましょう。サンプルのサーブレット(MyDataEntityServletクラス)の実装例を下に掲載しておきました。これは、idパラメータを付けてGETアクセスする(例えば、/hello?id=1 という具合)と、そのエンティティをentityという名前でリクエストに保存します。そしてPOST送信されたなら、送られたパラメータを元にエンティティを更新します。index.jsp側には、このentityの値を取り出してフォームに設定し送信するような仕組みを用意しておけばいいでしょう。
<% MyDataEntity entity = (MyDataEntity)request.getAttribute("entity"); %>
<form method="post" action="/hello">
<input type="hidden" name="id" value="<%= entity.getId() %>">
<div><input type="text" name="name" value="<%= entity.getName() %>"></div>
<div><input type="text" name="mail" value="<%= entity.getMail() %>"></div>
<div><input type="text" name="tel" value="<%= entity.getTel() %>"></div>
<div><input type="submit" value="Update"></div>
</form>これで、以下のようにアドレス指定してアクセスすると、指定のIDのデータがフォームに設定されます。
http://localhost:8080/hello?id=番号
そして、そのままフォームの内容を書き換えて送信すれば、そのIDのエンティティが更新されるというわけです。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
package com.tuyano.libro;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/hello")
public class MyDataEntityServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected EntityManagerFactory factory =
Persistence.createEntityManagerFactory("mydataentity-persistance");
@Override
public void init() throws ServletException {
super.init();
EntityManager manager = factory.createEntityManager();
try {
manager.getTransaction().begin();
manager.persist(
new MyDataEntity("taro", "taro@yamada", "090-999-999")
);
manager.persist(
new MyDataEntity("hanako", "hanako@flower", "080-888-888")
);
manager.persist(
new MyDataEntity("sachiko", "sachiko@happy", "070-777-777")
);
manager.getTransaction().commit();
} finally {
manager.close();
}
}
@Override
protected void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
int id = getId(request);
MyDataEntity entity = null;
EntityManager manager = factory.createEntityManager();
if (id > 0) {
entity = manager.find(MyDataEntity.class, id);
} else {
entity = new MyDataEntity();
}
request.setAttribute("entity", entity);
Query query = manager.createQuery("select i from MyDataEntity i");
List list = query.getResultList();
request.setAttribute("list", list);
RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp");
dispatcher.forward(request,response);
}
@Override
protected void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException {
int id = getId(request);
String name = request.getParameter("name");
String mail = request.getParameter("mail");
String tel = request.getParameter("tel");
EntityManager manager = factory.createEntityManager();
MyDataEntity entity = manager.find(MyDataEntity.class, id);
entity.setName(name);
entity.setMail(mail);
entity.setTel(tel);
manager.getTransaction().begin();
manager.merge(entity);
manager.getTransaction().commit();
request.setAttribute("entity", entity);
response.sendRedirect("/hello");
}
private int getId(HttpServletRequest request) {
String id_str = request.getParameter("id");
int id = 0;
try {
id = Integer.parseInt(id_str);
} catch(NumberFormatException e){
e.printStackTrace();
}
return id;
}
}
※関連コンテンツ
「初心者のためのJava Persistence API入門」に戻る