Red Hat Training

A Red Hat training course is available for Red Hat JBoss Web Server

第7章 バッチ処理

バッチ処理は従来、完全オブジェクト/関係マッピングで実現することは困難でした。ORM で重要なのはオブジェクトステータス管理であり、オブジェクトステータスがメモリ内で利用可能であることを暗黙的に示しています。ただし、Hibernate は Hibernate リファレンスガイドで説明された、バッチ処理を最適化する機能をいくつか持ちます。ただし、JPA 永続化は少し異なります。

7.1. 一括更新/削除

すでに説明したように、自動的かつ透過的なオブジェクト/関係マッピングは、オブジェクトステータスの管理に関係します。これは、オブジェクトステータスがメモリで利用可能であることを暗黙的に示します。したがって、データベースのデータを直接更新または削除した場合 (SQL の UPDATEDELETE を使用) に、データベースはメモリ内ステータスに影響を及ぼしません。ただし、Hibernate は、EJB-QL (8章EJB-QL: オブジェクトクエリ言語) で実行される一括 SQL スタイルの UPDATE および DELETE ステートメント実行を提供します。
UPDATE ステートメントと DELETE ステートメントの疑似構文は ( UPDATE | DELETE ) FROM? ClassName (WHERE WHERE_CONDITIONS)? です。以下のことに注意してください。
  • from 句で、FROM キーワードはオプションです。
  • from 句では 1 つのクラスだけ指定できます。エイリアスを指定することはできません (これは現在の Hibernate の制限であり、すぐに取り除かれる予定です)。
  • 結合 (暗黙的または明示的) は一括 EJB-QL クエリで指定できません。サブクエリは where 句で使用できます。
  • where 句もオプションです。
たとえば、EJB-QL の UPDATE を実行するには、Query.executeUpdate() メソッドを使用します。
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();

String ejbqlUpdate = "update Customer set name = :newName where name = :oldName";
int updatedEntities = entityManager.createQuery( ejbqlUpdate )
                            .setParameter( "newName", newName )
                            .setParameter( "oldName", oldName )
                            .executeUpdate();
entityManager.getTransaction().commit();
entityManager.close();
EJB-QL の DELETE を実行するには、同じ Query.executeUpdate() メソッド (このメソッドの名前は JDBC の PreparedStatement.executeUpdate() に精通しているユーザーに向けて付けられています) を使用します。
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();

String hqlDelete = "delete Customer where name = :oldName";
int deletedEntities = entityManager.createQuery( hqlDelete )
                            .setParameter( "oldName", oldName )
                            .executeUpdate();
entityManager.getTransaction().commit();
entityManager.close();
Query.executeUpdate() メソッドにより返された int 値は、操作により影響を受けたエンティティの数を示します。これは、データベースで影響を受けた行の数と相関関係にある場合があります (または相関関係にない場合もあります)。EJB-QL の一括操作により、たとえば、結合されたサブクラスに対して複数の実際の SQL ステートメントが実行されることがあります。返された数は、ステートメントにより影響を受けた実際のエンティティの数を示します。結合されたサブクラスの例について、サブクラスのいずれかに対して削除を行うと、サブクラスがマップされたテーブルだけでなく、「ルート」テーブルと継承階層の下層にある結合されたサブクラステーブルに対しても削除が行われます。