ho queste entitàHibernate - compensazione una collezione con tutti i-delete-orphan e aggiungendo ad esso provoca ConstraintViolationException
class Foo{
Set<Bar> bars;
}
class Bar{
Foo parent;
String localIdentifier;
}
Con questa mappatura (sorry, no annotazioni, io sono vecchio stile):
<class name="Foo">
...
<set name="bars" cascade="all-delete-orphan" lazy="false" inverse="true">
<key>...</key>
<one-to-many class="Bar"/>
</set>
</class>
<class name="Bar">
...
<property name="localIdentifier" column="local_identifier"/>
<many-to-one name="parent" column="parent_id" />
</class>
ho anche di un vincolo univoco 2 colonne: local_identifier
e parent_id
(non un vincolo univoco su ciascuno, ma un unico vincolo unico contenente sia, ad esempio, non sono permessi 2 righe con lo stesso genitore e stessa localIdentifier)
alter table bar add constraint unique_bar unique (parent_id, local_identifier)
E questo codice che li utilizza:
//foo is persistent, foo id = 1
Bars bars = foo.getBars();
bars.clear(); // bars contained 1 item [parent_id = 1, local_identifier = "a"]
Bar newBar = new Bar();
newBar.setParent(foo);
newBar.setLocalIdentifier("a");
bars.add(newBar);
Ora, per qualche ragione, Hibernate non esegue le cose nell'ordine in cui sono stati chiamati. Non esegue il clear()
(cancellare) prima della add()
(inserto), ma viceversa, si cerca prima di inserire, ottenendo un ConstraintViolationException
So che l'aggiunta di un po 'session.flush()
dopo bars.clear();
, potrebbe risolvere questo problema, ma in questo caso , Non ho accesso alla sessione in modo non brutto.
Quindi flush è l'unica soluzione? o c'è una versione di Hibernate che rispetta l'ordine delle azioni?
Aggiornamento: A proposito, dereferenziazione la collezione si tradurrà in una HibernateException da https://www.hibernate.org/117.html#A3:
ottengo HibernateException: Non dereference una collezione con cascade = "all-delete -orphan " Questo si verifica se si carica un oggetto con a cascata =" tutto-elimina-orfano " insieme e quindi si rimuove il riferimento alla raccolta. Non sostituire questa raccolta, utilizzare clear() in modo che l'algoritmo di eliminazione orfana possa rilevare la modifica.
Penso che il flushing sia l'unica opzione qui – ruchirhhi
Relative [argomento Hibernate Forum] (https://forum.hibernate.org/viewtopic.php?t=934483). –