2009-07-29 10 views
7

A jeśli tak, to jaka jest składnia?Czy można usunąć zbiorczo wiele powiązań z HQL?

Załóżmy, że chcę instancją Foo się skojarzenie ze wszystkich wystąpień Bar: W SQL byłoby po prostu:

delete from FOO_BAR_MAPPING 
where FOO_ID = ? 

W HQL, Sądziłem, że będzie to coś jak:

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

(gdzie foos jest mapowany zbiór Foo)

Ale wydaje się być złe, dając:

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

Czy to możliwe z HQL?

Odpowiedz

6

Aby odpowiedzieć na konkretne pytanie, nie, o ile jestem świadoma tego, że nie jest to możliwe z HQL .

Myślę, że nieco tu mieszacie SQL i HQL. W SQL rzeczywiście "usuwamy" rekordy, i oczywiście hibernacja ostatecznie to też zrobi. Jednak Hibernate/HQL został zaprojektowany z nastawionego na obiekt sposobu myślenia, więc "usuń" w tym kontekście oznacza, że ​​usuwasz obiekty, a nie asocjacje. Zwykle chcesz zrobić coś jak następuje:

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

ten pobiera obiekt o identyfikatorze określonym i usuwa wszystkie izb adwokackich czyszcząc to kolekcja. Oczywiście musisz mieć skojarzenie Foo-Bars odwzorowane we właściwym kierunku, aby to zadziałało.

+2

Należy zauważyć, że spowoduje to jedynie usunięcie wpisu tabeli powiązania, a nie elementu na końcu. Aby to zrobić, musisz mieć włączone usuwanie sierot. – aperkins

1

Usunięcie asocjacji nie jest możliwe z HQL. To, co możesz zrobić, to:

A) Zakładając, że robisz to dla pojedynczego Foo i twoja kaskada jest odpowiednio ustawiona, możesz załadować tę instancję Foo, wyczyścić jej kolekcję bars i ją zapisać.

B) Jeśli starasz się usunąć bars z wielu Foos można mapować zapytanie SQL zamiast HQL

Powiązane problemy