気楽なソフト工房

プログラミングについていろいろな記事を書いています。



mykonos2008

Author:mykonos2008
システムエンジニアとして働いている30代の会社員です。
仕事や趣味でプログラムを書いている方の役に立つ記事を書いていきたいと思っています。
ご意見、ご感想はこちらまで
If you are an english speaker,Please visit my english blog.

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
さて、本日は台帳を削除する部分のコードを紹介します。前回は、台帳の一覧を
取得するコードを紹介しましたが、現在のところ台帳の一覧画面はこんな感じになっております。



台帳の削除は一覧の各行の左端にあるチェックボックスにチェックを付けて「台帳を削除する」ボタンを
クリックすることで行えるようにします。

削除部分に入る前に一覧のJSPを少し紹介します。

[ledgerlist.jsp]
・・・・(省略)
<%
    @SuppressWarnings("unchecked")
    List<Ledger> ledgerList = (List<Ledger>)request.getAttribute("ledger_list");
%>
・・・・(省略)

<table width="500px">
<tr><td> </td><td>台帳名</td><td>作成者</td></tr>
<%
   for(Ledger ledger : ledgerList)
   {
%>

   <tr>
     <td><input name="chk_id" value="<%= ledger.getKey().getId() %>" type="checkbox"/></td>
     <td><a href="#" onClick="showDetail('<%= ledger.getKey().getId() %>')"><%= ledger.getLedgerName() %></a></td>
     <td><%= ledger.getCreatedBy() %></td>
   </tr>
<%
   }
%>
</table>

チェックボックスの「value」には、前回取得したLedgerクラスのKeyのIDを設定しています。削除する際には、削除する台帳を特定するために
このIDが必要になります。

次に削除のリクエストを処理するハンドラクラスのコードを紹介します。

[DeleteLedger.java]
public class DeleteLedger implements RequestHandler {

   @Override
   public void execute(HttpServletRequest req, HttpServletResponse resp)
         throws Exception {
      
      //削除対象の台帳IDを取得する
      String[] ids = req.getParameterValues("chk_id");
      
      //Daoを生成する
      LedgerDao dao = new LedgerDao();
      dao.DeleteLedger(ids);
      
      //一覧のハンドラにリクエストを転送する
      RequestDispatcher dispatcher =  req.getRequestDispatcher("/ctl/LedgerList");
      dispatcher.forward(req, resp);
   }
}

チェックが付いたチェックボックスの[value]を削除対象の台帳のIDとして、取得しそれをDAOクラスの台帳削除メソッドに
渡しています。

そして、肝心の台帳を削除する部分のコードです。

[LedgerDao.java]
public class LedgerDao {
   public void DeleteLedger(String[] ids)
   {
       //Initialize persistent manager.
       PersistenceManager pm = PMFHelper.get().getPersistenceManager();
      
       javax.jdo.Transaction tx = pm.currentTransaction();
       
       try
       {
          tx.begin();
          
          for(String id : ids)
          {
             //IDからLedgerクラスのインスタンスを取得する
             long longId = Long.parseLong(id);
             Ledger ledger = pm.getObjectById(Ledger.class,longId);

             //台帳を削除する
             pm.deletePersistent(ledger);
          }
          
          tx.commit();
       }
       finally
       {
          if(tx.isActive())
          {
             try
             {
                tx.rollback();
             }
             catch(Exception ex){}
          }
       
           pm.close();
       }
   }
}

エンティティの削除はPersistenceManagerのdeletePersistent()メソッドにエンティティのインスタンスを渡して行います。
従って、削除する前にまずクライアントから受け取ったIDで該当する台帳クラスのインスタンスを取得を行う必要があります。

キーのIDが有る場合は、PersistenceManagerクラスのgetObjectById()メソッドでキーのIDに該当するエンティティを取得することが
出来ます。ドキュメントによるとQueryを使っても出来るようですが、こちらの方が簡単ですね。

他のエンティティを所有するエンティティが削除されると、そのエンティティによって所有されているエンティティも同時に
削除されます。今回のアプリの場合では台帳クラスは物品を始めてとして、ほとんどのデータクラスのエンティティを所有しています。

従って、エンティティの削除を行う場合は、トランザクションを使用した方が良いです。

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://csfun.blog49.fc2.com/tb.php/60-aa181f03

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。