Zawsze aktualne dane w JTable, hibernate?

0

Mam pytanie o sposób aktualizacji danych w hibernate. Wyświetlam dane zaciągnięte z tabeli w JTable, działa ok. Jednak dane są pobierane w tranzakcji tylko przy otwieranu okna. następnie tranzakcja jest zamykana. Problem polega na tym że zmieniło się założenie programu i na danych może pracować więcej niz jedna osoba jednocześnie. Gdy dane osoba zaktualizuje dany wiersz kolejny pracownik widzi nadal stare dane. Jak najprościej wymusić aby w JTable były zawsze aktualne dane?

Przykład moich danych:

@Entity
@Cache(usage=CacheConcurrencyStrategy.READ_WRITE, region="POJO.slownik")
@Table(name = "SLOWNIKI")
public class Slownik implements Serializable{
 
    @Id
    @Column(name = "ID")
    @SequenceGenerator(name="PK",sequenceName="SLOWNIKI_SEQ", allocationSize=1, initialValue = 1)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator="PK")
    private int id;
     
    @Version                                                                   
    @Column(name = "WERSJA")
    private int wersja;
    
    @Column(name = "TYP")
    private String typ;
    
    @Column(name = "OPIS")
    private String opis;
    
    @Column(name = "AKTYWNY")
    private boolean aktywny;   

    public Slownik() {
    }    
.
.
.}</code


```java
 public static List getQuery(String query) throws IOException{
    Session session = HibernateUtil.getSessionFactory().openSession();
    Transaction tx=null;
    List resultList = null;
    try{
        tx=session.beginTransaction();
        Query q = session.createQuery(query);
        resultList = q.list();
        tx.commit();
        }
    catch (Exception e) {if (tx!=null) tx.rollback();e.printStackTrace();Log.setLog(e.toString());}
    finally {session.close();}
    return resultList;
 }  

Wyświetlenie:

    private void refreshSlowniki() throws IOException{       
    List resultList = DAO.GlobalDOA.getQuery("from Slownik order by id desc");
    displaySlowniki(resultList);
    }


    private void displaySlowniki(List resultList) {
     Vector<String> tableHeaders = new Vector<String>();
     Vector tableData = new Vector();
     tableHeaders.add("ID:"); 
     tableHeaders.add("Typ:");
     tableHeaders.add("Opis:");
     tableHeaders.add("Aktywny:");

     for(Object o : resultList) {
     Slownik actor = (Slownik)o;
     Vector<Object> oneRow = new Vector<Object>();
     oneRow.add(actor.getId());
     oneRow.add(actor.getTyp());
     oneRow.add(actor.getOpis());
     oneRow.add(actor.isAktywny());
     tableData.add(oneRow);
     }

     slownikiTable.setModel(new javax.swing.table.DefaultTableModel(tableData,tableHeaders) {
                Class[] types = new Class [] {
                     java.lang.Integer.class,        
                     java.lang.String.class, 
                     java.lang.String.class,
                     java.lang.Boolean.class,
                    };
                public Class getColumnClass(int columnIndex) {return types [columnIndex];}
                boolean[] canEdit = new boolean[]{false,false,false,false};
                public boolean isCellEditable(int rowIndex, int columnIndex) {
                    return canEdit[columnIndex];}
                });
    }

Używam oracla, może cos takiego:

public interface oracle.jdbc.dcn.DatabaseChangeListener
extends java.util.EventListener {
void onDatabaseChangeNotification(oracle.jdbc.dcn.DatabaseChangeEvent arg0);
}

Wszystkie sugestie mile widziane.

0

Ciekawy interfejs..nie znam. Ale możesz zrobić timera który co np 5 sekund sprawdza czy cos sie nie zmienilo

1

wzorzec obserwator albo lepiej Guava EventBus

0

Ja myśle że będziesz miał większe problemy niż aktualny widok. Bo co jak jeden user coś zmienia i drugi też. Nagle temu pierwszemu znikną te jego zmiany jak sie widok "zaktualizuje"? ;)

0

@up

Chyba najlepiej @Version, a w web.xml handlować pesimistic lock exception lub wyświetlać komunikat przy nadpisywaniu, że wypluło 'stale object'

0

@Shalom, @up ten prolbme mam rozwiązany przez @Version, nie ma problemu z nadpisaniem danych, działa to poprawnie. Mam jednak problme z odświerzaniem tego widoku.

1 użytkowników online, w tym zalogowanych: 0, gości: 1