Refresh-Problem mit EntityManager und JTable

thomasvonkapellen

Grünschnabel
Hallo,

ich verwende in einer Swing-Anwendung das JPA in Verbindung mit Hibernate. Auf einem FrameView befindet sich eine JTable Komponente, die über ein List- und Query Element mit der Datenbank verbunden ist.

Als IDE verwende ich Netbeans und ich habe zu Testzwecken eine Desktop-Datenbankanwendung per Wizard erstellt und habe einen Button den unten stehenden Quellcode ergänzt.

Es existiert eine Entität "Kontakte", die die Eigenschaften Name1, Name2 etc. hat.

In der JTable soll nun ein Datensatz ausgewählt werden, per NativeQuery - sozusagen an der Entität vorbei - auf Knopfdruck geändert werden und in der Tabelle aktualisiert werden.

Die Aktualisierung nehme ich mit der refresh-Methode, die auch funktioniert, aber es wird weiterhin in Tabelle der alte Wert angezeigt, obwohl die AKtualisierung selber funktioniert hat.

Hier ist der entscheidende Codeabschnitt:
Code:
    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
        // index des gwählten datensatzes in der jtable
        int selected = masterTable.getSelectedRow();
        
        EntityTransaction tx = entityManager.getTransaction();
        if (tx.isActive())
                tx.commit();

        // änderung eines wertes per native query
        tx.begin();
        Query qry;
        String sqlString="UPDATE kontakte SET name1=\"geänderter Name\" WHERE ktid="+ list.get(selected).getKtid();
        
        qry=entityManager.createNativeQuery(sqlString);
        qry.executeUpdate();
        // namensänderung wird hier in db eingetragen!!
        tx.commit();

        // neue transaktion starten
        tx.begin();

        // listenelemente sind vom typ Kontakte
        Kontakte k = list.get(selected);

        // aktualisierung des datensatzes
        entityManager.refresh(k);
        
        // aktualisierung hat stattgefunden, der entity manager
        // hat ein sql select-statement abgeschickt
        // und der geänderte wert wird ausgegeben
        System.out.println(k.getName1());
        
        // im jtable, das mit der list verbunden ist,
        // wird der alte wert angezeigt
        list.add(0,k);

       // später sollte es für die Aktualisierung heissen:
       // list.set(k);
        
        // hier wird der geänderte wert ausgegeben
        System.out.println(k.getName1());
        
    }

Habe mir auch schon den mit Netbeans automatisch generierten Code angeschaut, hier wird ein list.clear() aufgerufen und der gesmte Inhalt neu aufgebaut, was allerdings viel Zeit kostet .

Offensichtlci habe ich da ein Verständnisproblem mit der Funktionsweise des JPA, vielleicht kann mit ja jemand weiterhelfen :confused:.

Im voraus vieln Dank

Thomas
 
dieses Problem habe ich seit gestern auch. Wenn ich manuel eine Zelle editiere und speichere (entityManager.persist) wird dies nicht in die Datenbank geschrieben.
 
Das Problem hatte ich auch schon ein mal.
Evtl. helfen euch die beiden Codeschnippel weiter:

Code:
myTable.getModel().setValueAt(aValue, rowIndex, columnIndex);

Code:
myModel.fireTableDataChanged();
 
Zurück