Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
EclipseLink macht das intern um nur Felder in der Datenbank zu ändern die auch wirklich geändert wurden. Das siehst du, wenn du dir die SQL-Statements anzeigen lässt.
Mhm ja mal schauen^^ hört sich nicht nach einer sauberen Lösung an.
Ich hol mal bischen weiter aus fürs bessere Verständniss meines Problems.
Ich habe meine Models mit EMF generieren lassen und mit Teneo die orm.xml gemacht. Das hat ganz gut geklappt.
Dann wollte ich eine saubere Lösung finden für die isDirty Methode in einem Eclipse RCP Editor. Und ich wollte natürlich nur das Speichern anbieten wenn das Objekt auch dirty ist bzw. wenn was geändert wurde (sowie beim Eclipse Java Editor). Dann hat mir wildcard gesagt benutz Resourcen für das speichern und laden von EMF Models die unterstützen die TrackingModification. Wo ich mir dann den src angeschaut hab wird das für EclipseLinkResource (siehe oben) nicht unterstützt und die Abfragen mit EclipseLinkResource sind auch sehr umständlich und um alle Abfragen durchzuführen muss man die Klasse teilweise selbst implmenentieren.
Joa und deshalb such ich gerade ne andere Möglichkeit , um das sauber hinzukriegen. Vielleicht bietet EMF oder so noch ne Möglichkeit für changes.
Ja aber dann ist eine AOP-Proxy-Version doch super. Du musst ja nicht mal wissen welches Feld geändert wurde, sondern nur generell ob was geändert ist.
Ergo Mini-Interceptor welcher das originale Objekt rausgeben kann (für EclipseLink / JPA) und ansonsten alle Set-Methoden abfängt und isDirty auf true setzt.
Also ich würde im RCP Editor nicht auf dem Original Objekt arbeiten sondern auf einer Kopie.
Wenn beim Speichern was schiefgeht, was zeigst du an?
Um rauszufinden ob sich was geändert hat, kann man einfach die Kopie mit dem Original vergleichen.
Wenn das Speichern fehlschlägt, kann man wieder das original Kopieren.
Wenn der User nicht Speichern will (Abbrechen), was machst du dann? Du musst es neu laden.
Mit der Kopie nicht nötig.
etc.
Das ganze kann man dan noch hübsch verpacken (als aufgebohrten Proxy) und dann kann man auch richtig hübsch dami arbeiten
@Override
public boolean equals(Object obj) {
return BeanUtils.equals(this, obj);
}
@Override
public int hashCode() {
return BeanUtils.hashCode(this);
}
@Override
public String toString() {
return BeanUtils.toString(this);
}
Den Spaß kann man dann noch in ne Abstrakte klasse auslagern und dann ist davon garnix im eigentlichen Pojo. Bei Bedarf kann man das dann auch überschreiben wie man will (Besser als AOP und Co finde ich).
Und fürs kopieren kann man auch Serialisierung verwenden, sind ja eh alles nur pojos (sollten es zumindest sein denk ich). Ist zwar ein wenig langsamer als clone, aber darauf kommts nicht an (das wird man normalerweise nicht merken).
Und der Code bleibt schön sauber. Komplexe Objekthierarchien mit Maps etc sind für den Client sowieso ungeeignet,
von daher bekommst du da im normalfall auch keine Probleme.
Also ich würde im RCP Editor nicht auf dem Original Objekt arbeiten sondern auf einer Kopie.
Wenn beim Speichern was schiefgeht, was zeigst du an?
Um rauszufinden ob sich was geändert hat, kann man einfach die Kopie mit dem Original vergleichen.
Wenn das Speichern fehlschlägt, kann man wieder das original Kopieren.
Wenn der User nicht Speichern will (Abbrechen), was machst du dann? Du musst es neu laden.
Mit der Kopie nicht nötig.
etc.
Das ganze kann man dan noch hübsch verpacken (als aufgebohrten Proxy) und dann kann man auch richtig hübsch dami arbeiten
Ja so ähnlich habe ich bis jetzt gemacht ein dirtyObjekt und ein normales Objekt und die immer mit EcoreUtils.equals miteinander verglichen...
Nicht speichern geht ja nur wenn du den Editor schließt also kannst auch das Objekt wegschmeißen und bei öffnen des neuen Editor kannst es neu laden.