2009-07-29 4 views
7

Und wenn ja, wie lautet die Syntax?Ist es möglich, aus einer vielfachen Assoziation mit HQL zu löschen?

wird angenommen, dass ich eine Instanz von Foo wollen von allen Instanzen der Bar unassociated sein: In SQL wäre es einfach sein:

delete from FOO_BAR_MAPPING 
where FOO_ID = ? 

In HQL, nahm ich an, es wäre so etwas wie:

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

(wo foos ist eine kartiert Sammlung von Foo)

aber scheint falsch zu sein, geben:

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

Ist das mit HQL überhaupt möglich?

Antwort

6

Um Ihre Frage zu beantworten, nein, soweit ich weiß, es ist nicht möglich, mit HQL .

Ich denke, Sie mischen SQL und HQL ein wenig hier. In SQL "löscht" man tatsächlich Datensätze, und natürlich wird der Hibernate das auch tun. Hibernate/HQL wurde jedoch aus einer objektorientierten Denkweise entwickelt, daher bedeutet "Löschen" in diesem Kontext, dass Sie Objekte löschen, keine Assoziationen. Normalerweise würden Sie etwas tun, wie folgt:

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

Dies ruft das Objekt durch die id Sie angegeben, und entfernt alle Anwaltskammern durch Löschen es Sammlung. Offensichtlich müssen Sie die Foo-Bars-Assoziation in die richtige Richtung kartiert haben, damit dies funktioniert.

+2

Beachten Sie, dass dies nur den Eintrag der Zuordnungstabelle löscht, nicht das Element am Ende. Um dies zu tun, müssten Sie Delete-Waisen eingeschaltet haben. – aperkins

1

Das Entfernen von Verknüpfungen ist mit HQL nicht möglich. Was Sie jedoch tun können, ist entweder:

A) Angenommen, Sie tun es für ein einzelnes Foo und Ihre Kaskade ist geeignet eingestellt, können Sie diese Foo Instanz laden, löschen Sie ihre Sammlung von bars und speichern Sie sie.

B) Wenn Sie versuchen, bars von mehreren löschen Foos können Sie eine SQL-Abfrage statt HQL Karte