Witajcie.
Taka oto acosjaja z wykozystaniem hibernata:
@Entity
@Table(name = "CHECKLIST")
@SequenceGenerator(name="PK",sequenceName="GEN_CHECKLIST_ID",allocationSize=1)
public class Checklist implements java.io.Serializable{
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="PK")
@Column(name = "ID")
private int id;
@Column(name = "QUESTION")
private String question;
@JoinColumn(name = "KIND_ID")
@ManyToOne
private Kind kind;
@JoinColumn(name = "PRIORITIES_ID")
@ManyToOne
private Priority priority;
@JoinColumn(name = "AREA_ID")
@ManyToOne
private Area area;
@JoinColumn(name = "STANDARD_ID")
@ManyToOne
private Standard standard;
@Column(name = "COMMENTS")
private String comment;
@JoinColumn(name = "USER_ID")
@ManyToOne
private UserLogin userLogin;
@Column(name = "ADDED")
private Timestamp timestamp;
@Column(name = "ACTIVE")
private boolean active;
Odczyt z bazy danych:
public void refresh(){
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx=null;
try{
session.beginTransaction();
Query q = session.createQuery("from Checklist");
List resultList = q.list();
display(resultList);
session.getTransaction().commit();
}
catch (Exception e) {if (tx!=null) tx.rollback();e.printStackTrace(); }
finally {session.close();}
}
Wyświetlenie w jTable:
private void display(List resultList) {
Vector<String> tableHeaders = new Vector<String>();
Vector tableData = new Vector();
tableHeaders.add("ID:");
tableHeaders.add("Pytanie:");
tableHeaders.add("Typ:");
tableHeaders.add("Priorytet:");
tableHeaders.add("Obszar:");
tableHeaders.add("Standard:");
tableHeaders.add("Komentarz:");
tableHeaders.add("Dodał:");
tableHeaders.add("Data dodania:");
tableHeaders.add("Aktywne:");
for(Object o : resultList) {
Checklist actor = (Checklist)o;
Vector<Object> oneRow = new Vector<Object>();
oneRow.add(actor.getId());
oneRow.add(actor.getQuestion());
oneRow.add(actor.getKind().getDescription());
oneRow.add(actor.getPriority().getDescription());
oneRow.add(actor.getArea().getDescription());
oneRow.add(actor.getStandard().getDescription());
oneRow.add(actor.getComment());
oneRow.add(actor.getUserLogin().getName()+" "+actor.getUserLogin().getSurname());
oneRow.add(actor.getTimestamp());
oneRow.add(actor.isActive());
tableData.add(oneRow);
}
}
I tutaj wszystko pięknie działa, problem pojawia się przy aktualizacji danych bezpośrednio w jTable. Do tabelki dołożyłem lisenera zmiany danych:
table.getModel().addTableModelListener(new TableModelListener() {
public void tableChanged(TableModelEvent e){
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction tx=null;
tx = session.beginTransaction();
try{
UserLogin l = (UserLogin)session.get(UserLogin.class, userID);
Checklist c = (Checklist)session.get(Checklist.class, index);
int row=table.getSelectedRow();
c.setQuestion(String.valueOf(table.getModel().getValueAt(row, 1)));
c.setComment(String.valueOf(table.getModel().getValueAt(row, 6)));
c.setUserLogin(l);
c.setTimestamp(new Timestamp(System.currentTimeMillis()));
session.update(c);
tx.commit();
}
catch (Exception exp) {if (tx!=null) tx.rollback();exp.printStackTrace(); }
finally {session.close();}
}
});
I teraz gdy zmieniam dane nie będące w relacji jak np. pytanie wszystko gra. Po zmianie w jtable zostaje to przeniesione do bazy. Problem pojawia się gdy zmieniam dane będące w relacji jak np. UserLogin w bazie wszytko się zmienia jednak w jtable pozostaje bez zmiany. Poptrzebne jest kolejne wywolanie funkcj refresh czyli tak naprwde odczyt z bazy.
Domyślam się że działa po poprawnie ponieważ zmia dokonuje nie w jTable tyko tworząc i sktualizując nowy obiekt UserLogin l = (UserLogin)session.get(UserLogin.class, userID); dlatego jTable nic nie wie o tej zmianie. Czy jest jakis sposób aby wymusić taka aktualizacje, bez pobierania danych z bazy kolejny raz?