2009-07-29 4 views
7

もしそうなら、構文は何ですか?HQLとの多対多関連から一括削除できますか?

私はFooのインスタンスは、バーのすべてのインスタンスから関連付けられていないようにしたいと仮定します。SQLで それは単に次のようになります。

:HQLで

delete from FOO_BAR_MAPPING 
where FOO_ID = ? 

、私はそれはようなものになるだろうと想定しました与え、

(FOOSがfooのマッピングされたコレクションである)しかし、間違っているように見える

delete from Bar.foos foos 
where foos.id = :id 

org.hibernate.hql.ast.QuerySyntaxException: Bar.foos is not mapped 

これはHQLでも可能ですか?

答えて

6

のSQLクエリをマッピングすることができます。

ここで少しSQLとHQLを混在させていると思います。 SQLでは、実際にレコードを「削除」しますが、もちろん休止状態でもそれが最終的に行われます。しかし、Hibernate/HQLはオブジェクト指向の考え方から設計されているので、この文脈では「削除」とはアソシエーションではなくオブジェクトを削除することを意味します。

Foo f = session.get(Foo.class, id); 
f.getBars().clear(); 
session.merge(f); 

これは、指定したIDでオブジェクトを取得し、それは、コレクションのクリアすることで、すべてのバーの関連付けを削除します。次のように通常は、何かをしたいです。明らかに、これが機能するためには、Foo-Bars関連付けを適切な方向にマップする必要があります。

+2

これは、関連テーブルのエントリだけを削除し、最後の要素は削除しないことに注意してください。これを行うには、delete-orphansをオンにする必要があります。 – aperkins

1

HQLでは関連付けのみを削除することはできません。

A)あなたは、単一のFooのためにそれをやっているし、あなたのカスケードが適切に設定されていると仮定すると、あなたがbarsFooインスタンス、明確にそのコレクションをロードし、それを保存することができます:あなたは何ができるか、しかし、どちらかです。

B)は、複数のbarsをクリアしようとしている場合Foosあなたは私の知る限り、それはHQLとはできません承知しているように、いや、あなたの特定の質問に答えるために代わりにHQL