Zwei TableModels - Problem bei Datenmanipulation/-aktualisierung

Erstmal ein herzliches Hallo an das Forum.

Nun muss ich doch mal eine Frage stellen wo ich selbst nicht mehr weiter komme und Hilfe brauche. Folgende Ausgangssituation liegt vor:

  • Datenbank + Hibernate Mapping
  • eigenes TableModel welches Daten aus der DB verwaltet
  • zwei JTables
  • Listener welche per Tastendruck Werte der Tabelle ändert

Folgendes Szenario ist gegeben:
DB wird ausgelesen und das TableModel wird gefüllt. Dabei werden die Werte aus dem DB Entity gelesen und das Entity selbst in einer Spalte gespeichert um später schneller Zugriff zu haben. Das ganze sieht dann verkürzt so aus:

TableRow row1 = new TableRow(entity, entity.getName(), entity.getFlags())
tableModel1.add(row)

TableRow row2 = new TableRow(entity, entity.getName(), entity.getFlags(), entity.isActive())
tableModel2.add(row)

Das das doppelt ist, ist nicht gerade schön, aber so hat es funktioniert. Das das unnötig ist, sei hier mal außen vor.
Das Flag Feld beinhaltet eine Liste von möglichen Flags, welche in einer anderen Tabelle stehen.

Nun reagiert eine Tabelle auf einen Tastendruck und ein Flag, der selektieren Zeile, soll entfernt werden

entity = tableModel1.getValueAt(row, TableModel.Entity)
entity.removeFlag(flag);
tableModel1.setValue(row, entity.getFlags())

Problem an der Sache:
Auch in der zweiten Tabelle wird die entsprechende Spalte geändert, sprich das Flag wurde gelöscht.

Frage
Wieso

Erst hätte ich gedacht, das das damit zusammenhängt das im Grunde die Referenz bei beiden Tabellen auf die gleiche Liste von Flags zeigt. Aber da das ganze nur bei der Liste, und nicht z.B. beim Namen geschieht, bin ich etwas ratlos wo genau da der (Denk-)Fehler liegt.

Falls mehr Infos benötigt werden, bzw irgendwas unklar ist kann ich das natürlich versuchen nochmal genauer zu beschreiben

Deine Analyse ist schon richtig. Beide TableRows halten sie selbe Flagliste in der Hand, deren Inhalt geändert wird.
Wenn Du aber den Namen änderst weist Du dem einen TableModel.Entity einen neuen String zu, wovon das andere nichts mit bekommt.

bye
TT

Das hab ich auch erst gedacht. Aber bei so einer Konstruktion wird
a) die Liste in beiden Tabellen gelöscht
b) der Name nur in Tabelle1 geändert

entity.setFlag(new List());
tableModel1.setValue(entity.getFlags(), row, FLAG);

entity.setName("neuerName");
tableModel1.setValue(entity.getName(), row, NAME);

Müsste der Logik nach dann nicht auch der Name in beiden geändert werden?

[QUOTE=MannOhneNick]Müsste der Logik nach dann nicht auch der Name in beiden geändert werden?[/QUOTE]Ehr die Liste nur in einem.

bye
TT

Ja. Je nachdem in welche Richtung man argumentiert. Meine war jetzt “Wenn sich die Liste ändert, dann auch der Name”

[QUOTE=MannOhneNick]Ja. Je nachdem in welche Richtung man argumentiert. Meine war jetzt “Wenn sich die Liste ändert, dann auch der Name”[/QUOTE]Ich dache mehr in die Richtung dass jedes der TableModels sein eigenes TableModel.Entity-Objekt hat und nur die Liste in beiden die selbe ist, und wenn das eine dann eine neue Liste bekommt…

bye
TT

Achso, nein. Eigentlich ist der einzige Unterschied der beiden Models das sie eine unterschiedliche Menge an Informationen beinhalten. Um das vereinfacht darzustellen hab ich das ganze etwas verkürzt.
Aber in beiden Tabellen stehen u.U. in den gleichen Zeilen gleiche Objekte.

tableModel1.getValue(row, ENTITY) == tableModel2.getValue(row, ENTITY);

Dann schau Dir noch mal die Implementierung von TableRow an. Das übergeben des entity als erstem Parameter ist für mich verdächtig…

bye
TT

Inwiefern? Es steht in der Row mit drin um Zugriff auf das ganze Objekt zu haben und nicht jedesmal die DB fragen zu müssen. Denn in der Tabelle werden nicht alle Eigenschaften des Entitys angezeigt

[QUOTE=MannOhneNick]Es steht in der Row mit drin um Zugriff auf das ganze Objekt zu haben [/QUOTE]Eben! Und offensichtlich wird beim Setzen der Liste was anderes gemacht als beim setzen des Names…

bye
TT

Die neue Vermutung liegt im Bereich der DB bzw. Hibernate. Da das eine simple Strings sind und das andere von Hibernate verwaltete Listen. Denn Instanziiere ich die Tabelle mit new Row(entity, entity.getName(), new Set()) kommt es danach zu keinen Problemen und alles tut wie es soll. Sieht man davon ab das die Spalte halt zu Beginn leer ist

€: Ziemlich sicher liegt es an den Listen. Denn hier braucht man sowas wie setValue(entity.getFlags(), row, FLAG) gar nicht um die Tabelle zu aktualisieren. Das tut sie von selbst

Sehe grad das das im falschen Bereich gelandet ist. Kann das wohl wer verschieben