ich eine Entität löschen möchten, die eine @OneToMany Beziehung mit einem anderen hat, wie diese ein:Wie Beziehung zu aktualisieren, bevor Einheit Löschen
public class Dealership implements Serializable {
@OneToMany(cascade = CascadeType.ALL, mappedBy = "dealership", orphanRemoval = true)
private Set<Car> cars;
}
public class Car implements Serializable {
@ManyToOne
@JoinColumn(name="co_id")
private Dealership dealership;
}
Die Sache ist die, dass, wenn ich die Händler löschen, ich möchte nur die Autos löschen, die nicht verkauft wurden. Und egal, was ich versuche, löscht Hibernate ALLE Autos, die mit dem Autohaus verbunden sind, durch die Kaskade. Hier ist, was ich versucht habe. In diesem Beispiel versuche ich, die verkauften Autos zu einem anderen Händler zu übertragen, und dann lösche ich den Händler. Dies soll die Händler löschen, seine Mitarbeiter, und nur die Autos, die nicht verkauft wurden:
Session session = SessionManager.getSession();
Transaction tx = session.beginTransaction();
Dealership dealershipToDelete = (Dealership) session.load(Dealership.class, idDealership);
for(Car c: dealershipToDelete.getCars().stream().filter(c -> c.isSold()).toArray(Car[]::new)){
Dealership newDealership = (Dealership) session.load(Dealership.class, idNewDealership);
c.setDealership(newDealership);
dealershipToDelete.getCars().remove(c);
}
session.update(dealershipToDelete);
session.flush();
session.delete(dealershipToDelete);
tx.commit();
session.close();
Aber es löscht immer alle Autos. Auch wenn es mir gelingt Hibernate die Autos mit dem neuen Autohaus zu aktualisieren. Es aktualisiert sie und löscht sie dann. Hilfe würde sehr geschätzt werden. Vielen Dank.
Sie fügen die Autos dem neuen Autohändler nicht hinzu. Sie entfernen die Autos nicht von ihrem alten Händler. –
Entschuldigung, ich habe vergessen, die Zeile hinzuzufügen, die das Auto aus dem alten Autohaus entfernt hat. Ich habe es bereits getestet, bevor ich das gepostet habe. Es funktioniert immer noch nicht. Jetzt habe ich es nicht zu der neuen Beziehung hinzugefügt. Aber jetzt, da ich diese Linie auf der Schleife hinzugefügt (am Ende davon): 'newDealership.getCars() in (c);' Es wirft diese Ausnahme:. Exception in thread "main" org. hibernate.ObjectDeletedException: Gelöschtes Objekt wird erneut durch Kaskadenspeicherung gespeichert (entferntes Objekt aus Assoziationen entfernen): [hibernate.entities.Car # 14] – MatiasP
@MatiasMGS ist Ihr Problem gelöst? –