4

cascade="delete" がどのように機能するかについて、私は少し混乱しています。City マッピング ファイルで次のようにマッピングを定義しました。

<set inverse="true" name="client" cascade="delete">
  <key>
    <column name="id_name"/>
  </key>
    <one-to-many class="model.Client"/>
 </set>

クラス Client には、クラス City への外部キーがあります。

だから私が実行すると:

List object = null;
try {
   org.hibernate.Transaction tx = session.beginTransaction();
   try {
       session.delete("from City where row_id=" + row_id and table_id = " + table_id);
   } catch (Exception e) {
       e.printStackTrace();
   }
}

すべてのクライアントも削除する必要がありますか、それとも何らかの方法で処理する必要がありますか? クエリをメソッド パラメータとしてセッションの delete() メソッドに正しく渡していますか? 助けてくれてありがとう。よろしく、サス。

4

2 に答える 2

7

cascade="delete" がどのように機能するかについて少し混乱しています (...)

操作をカスケードするdeleteということは、あなたdeleteが親である場合、関連付けに沿って操作が伝播されることを意味します。したがって、あなたの場合、Cityエンティティの削除は s に伝播する必要がありますClient

したがって、実行すると (...) すべてのクライアントも削除する必要があります

HQL クエリ文字列Session#delete(String)を受け取り、それを実行し、結果を反復処理し、カスケードを考慮して各オブジェクトを呼び出すメソッド (そのため、クエリが実際に HQL クエリである場合、クライアントは削除されます)。Session#delete(Object)

しかし、このメソッドは古く、Hibernate 3 で廃止されました (そして「クラシック」Sessionインターフェースに移動しました)。私はあまりお勧めしません (1+N 操作を実行し、膨大な数の結果を削除するにはかなり非効率的です)。

これが懸念される場合は、Hibernate が提供する一括削除サポートを優先してください。

int deleteCount = session.createQuery("delete from Foo where bar = :bar") 
    .setParameter("bar", bar);
    .executeUpdate()

ただし、一括削除には制限があることに注意してください。

  • エイリアスは使用できません。
  • クエリに内部結合はありません (ただし、where 句でサブセレクトを使用できます)。
  • 一括削除はカスケードしません(また、結合テーブルを処理しません)。

Clientしたがって、一括削除では、 の前にを削除する必要がありますCity。しかし、パフォーマンスははるかに優れています。

commit()PS:ある時点で必要です(またrollback()、catch ブロックでエラー処理を改善する必要があります) 。

参考文献

于 2010-09-15T08:47:39.510 に答える
0
  1. 都市を削除すると、すべてのクライアントも削除されます。クライアントを削除すると、都市はそのままになります。

  2. session.delete()HQLクエリでは呼び出すことができません。削除するには、1つの都市に渡す必要があります。

または、を使用session.createSQLQuery()して削除ステートメントを作成することもできます。これにより、一度に多くの都市を削除できます。この方法の欠点は、クライアントを自分で削除してキャッシュフラッシュする必要があることです(Hibernateはクエリの意味を理解しようとはしません)。

于 2010-09-15T07:41:28.427 に答える