libro
www.tuyano.com
初心者のためのJava Persistence API入門

CRUDの基本 (4/5)

作成:2017-10-28 09:35
更新:2017-10-28 09:35

■Updateの基本

エンティティの更新(Update)は、いくつかの機能を組み合わせて実現します。その基本的な処理を整理すると以下のようになります。

1. 更新するエンティティを取得する
変数 = manager.find( [class] , 値 );
まず、EntityManagerクラスの「find」メソッドを使って、IDを指定して更新するエンティティを取得します。

2. エンティティを書き換える
取得したエンティティのSetterメソッドを呼び出して、フィールドの値を書き換えておきます。MyDataEntityならば、setNamesetMailsetTelといったメソッドを用意してありましたね。

3. 更新を行う
manager.getTransaction().begin();
manager.merge(……エンティティ……);
manager.getTransaction().commit();
トランザクションをスタートし、そこでEntityManagerの「merge」というメソッドを実行します。これは、引数に指定したエンティティをデータベースのテーブルにマージする(既にあるレコードに合成する)ものです。

エンティティの更新は、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のエンティティが更新されるというわけです。

※プログラムリストが表示されない場合

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入門」に戻る