Hi ihrs,
wir sind gerade dabei eines unserer Projekte von JDO nach Hibernate umzustellen und sind da auf ein seltsames Verhalten gestossen, das wir nicht so recht verstehen und uns vor einige Probleme stellt. Ich hoffe, ihr könnt helfen. Folgende Situation:
Wir haben 2 Klassen, Produkt und Lieferant. Ein Produkt beitzt genau einen Lieferanten, Lieferanten wissen nix über ihre Produkte, es ist also eine unidirektionale ManyToOne-Beziehung. Beide Klassen sind versioniert. Das Mapping im Produkt lautet in etwa:
Code:
@Override
@ManyToOne(targetEntity = LieferantImpl.class, fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "lieferant_id")
public Lieferant getLieferant() {
...
}
In einem TestCase erstellen wir einen Lieferanten und speichern ihn. Wie erwartet hat der die Version 0. Danach legen wir mehrere Produkte an, die den Lieferanten zugewiesen bekommen.
Bei jedem Speichern eines (neuen) Produkts wird nun die Version des Lieferanten erhöht, was wir nicht so ganz verstehen. Eigentlich hat sich am Lieferant doch nix geändert, der sollte nicht mal wissen, dass er zugewiesen wurde, es handelt sich doch eigentlich um eine
unidirektionale Beziehung, die nur das Produkt betrifft.
Nach diesem Vorgang haben wir also die Situation, dass wir mehrere Produkte (detached) mit (eigentlich) demselben Lieferant, aber in unterschiedlichen Versionen besitzen. Wenn wir nun eines der Produkte bearbeiten (nicht den Lieferant, irgendwas anderes) und das speichern wollen, bekommen wir eine StaleObjectStateException, da die Version des Lieferanten nicht stimmig ist. Das ist mittelprächtig ärgerlich.
Das Problem wird sicher auch noch an anderen Stellen auftreten. Daher die Frage: Wie macht man sowas am Besten? Es handelt sich im eine Web-Applikation, bei der es immer mal wieder vorkommen wird, dass Daten (ein Produkt) geladen und detached und erst nach längerer Zeit wieder geschrieben werden. Wenn sich bei jedem ändern/anlegen die Versionen aller abhängiger Entitäten verändern ist bei einem komplexen Objektgraphen die Wahrscheinlichkeit sehr hoch, dass sich mindestens eines der abhängigen Objekte in der Zwischenzeit verändert hat und man das Owner-Objekt (in diesem Fall das Produkt) nicht wieder schreiben kann.
Ich hoffe die Beschreibung war einigermaßen verständlich ;-) Würde mich freuen, wenn jemand da nen Rat oder sogar DIE Lösung hat.
Gruß
Steffen