Red Hat Training
A Red Hat training course is available for Red Hat JBoss Web Server
第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 ステートメントが実行されることがあります。返された数は、ステートメントにより影響を受けた実際のエンティティの数を示します。結合されたサブクラスの例について、サブクラスのいずれかに対して削除を行うと、サブクラスがマップされたテーブルだけでなく、「ルート」テーブルと継承階層の下層にある結合されたサブクラステーブルに対しても削除が行われます。