2009-07-29 5 views
7

E se sì, qual è la sintassi?È possibile eliminare in blocco da un'associazione many-many con HQL?

Si supponga che voglio un'istanza di Foo di essere non associato da tutte le istanze di Bar: In SQL Sarebbe semplicemente:

delete from FOO_BAR_MAPPING 
where FOO_ID = ? 

In HQL, ho pensato che sarebbe qualcosa di simile:

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

(dove foos è una raccolta mappato di Foo)

Ma sembra essere sbagliato, dando:

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

Ciò è possibile anche con HQL?

risposta

6

Per rispondere alla tua domanda specifica, no, per quanto io sappia non è possibile con HQL .

Penso che stiamo unendo qui SQL e HQL un po '. In SQL, infatti, si "cancellano" i record e, naturalmente, anche l'ibernazione lo farà. Comunque Hibernate/HQL è progettato da una mentalità orientata agli oggetti, quindi "cancella" in questo contesto significa che stai eliminando oggetti, non associazioni. In genere si farebbe qualcosa come segue:

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

Questo recupera l'oggetto l'id specificato, e rimuove tutte le associazioni Bar deselezionando la sua collezione. Ovviamente è necessario che l'associazione Foo-Bar sia mappata nella direzione corretta perché funzioni.

+2

Si noti che questo eliminerebbe solo la voce della tabella di associazione, non l'elemento alla fine. Per fare ciò, è necessario avere delete-orphans attivato. – aperkins

1

La rimozione delle associazioni non è possibile con HQL. Quello che puoi fare, tuttavia, è:

A) Supponendo che lo stai facendo per un singolo Foo e la tua cascata è impostata in modo appropriato, puoi caricare quell'istanza Foo, cancellare la sua raccolta di bars e salvarla.

B) Se si sta cercando di cancellare bars da più Foos è possibile mappare una query SQL invece di HQL