第7章 バッチ処理
バッチ処理は従来、完全オブジェクト/関係マッピングで実現することは困難でした。ORM で重要なのはオブジェクトステータス管理であり、オブジェクトステータスがメモリ内で利用可能であることを暗黙的に示しています。ただし、Hibernate は Hibernate リファレンスガイドで説明された、バッチ処理を最適化する機能をいくつか持ちます。ただし、JPA 永続化は少し異なります。
7.1. 一括更新/削除 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
すでに説明したように、自動的かつ透過的なオブジェクト/関係マッピングは、オブジェクトステータスの管理に関係します。これは、オブジェクトステータスがメモリで利用可能であることを暗黙的に示します。したがって、データベースのデータを直接更新または削除した場合 (SQL の
UPDATE と DELETE を使用) に、データベースはメモリ内ステータスに影響を及ぼしません。ただし、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 ステートメントが実行されることがあります。返された数は、ステートメントにより影響を受けた実際のエンティティの数を示します。結合されたサブクラスの例について、サブクラスのいずれかに対して削除を行うと、サブクラスがマップされたテーブルだけでなく、「ルート」テーブルと継承階層の下層にある結合されたサブクラステーブルに対しても削除が行われます。