2 つのテーブルに対して削除クエリを実行できるように、Java hibernate でバッチ処理の例を見つけることができますか。
2 に答える
Hibernate Referenceの関連する章を確認してください。
ドキュメントには、DML スタイルの操作に関する章が含まれています。
13.4. DML スタイルの操作
すでに説明したように、自動で透過的なオブジェクト/リレーショナル マッピングは、オブジェクトの状態の管理に関係しています。オブジェクトの状態はメモリで利用できます。これは、データベースでデータを直接操作しても (SQL データ操作言語 (DML) ステートメント: INSERT、UPDATE、DELETE を使用して) メモリ内の状態に影響しないことを意味します。ただし、Hibernate は、Hibernate Query Language (HQL) を介して実行されるバルク SQL スタイルの DML ステートメント実行のメソッドを提供します。
UPDATE および DELETE ステートメントの疑似構文は次のとおりです
( UPDATE | DELETE ) FROM? EntityName (WHERE where_conditions)?
。注意すべき点:
- from句では、FROMキーワードはオプションです
- from 句で指定できるエンティティは 1 つだけです。ただし、別名にすることはできます。エンティティ名に別名が付けられている場合は、その別名を使用してすべてのプロパティ参照を修飾する必要があります。エンティティ名がエイリアス化されていない場合、プロパティ参照を修飾することはできません。
- 一括 HQL クエリでは、暗黙的または明示的な結合を指定できません。サブクエリは、サブクエリ自体に結合を含めることができる where 句で使用できます。
- where句もオプションです。
(...)
HQL DELETE を実行するには、同じ
Query.executeUpdate()
メソッドを使用します。Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); String hqlDelete = "delete Customer c where c.name = :oldName"; // or String hqlDelete = "delete Customer where name = :oldName"; int deletedEntities = s.createQuery( hqlDelete ) .setString( "oldName", oldName ) .executeUpdate(); tx.commit(); session.close();
メソッドによって返される int 値は
Query.executeUpdate()
、操作によって影響を受けるエンティティの数を示します。これは、データベースで影響を受ける行数と相関する場合と相関しない場合があります。HQL 一括操作により、複数の実際の SQL ステートメントが実行される場合があります (たとえば、joined-subclass の場合)。返される数値は、ステートメントによって影響を受ける実際のエンティティの数を示します。結合されたサブクラスの例に戻ると、サブクラスの 1 つに対する削除は、実際には、そのサブクラスがマップされているテーブルだけでなく、「ルート」テーブルおよび潜在的に結合されたサブクラスのテーブルに対しても削除される可能性があります。継承階層。
ただし、2 つのテーブルに対して削除クエリを実行できるように、あなたが何を意味するのかわかりません。文書化されているように、一括操作はカスケードしないことに注意してください。