2015-10-21 2 views
1

Je suis novice dans l'utilisation d'Hibernate. Et mon problème est le suivant: je développe une application de bureau. Cette application est utilisée dans différents ordinateurs. Lorsqu'un ordinateur ajoute un nouvel utilisateur à ma base de données, l'autre ordinateur ne peut pas voir le nouvel utilisateur tant qu'il ne ferme pas et n'ouvre pas l'application à nouveau.Comment mettre à jour les données de ma base de données dans mon application Java avec Hibernate?

Je ne comprends pas parce que la sessionFactory est différente. J'utilise Hibernate pour lire les utilisateurs.

session = Settings.sessionFactory.openSession(); 

String selectSql = "select c.idClient, c.name FROM Clients c WHERE c.active=1 ORDER BY c.name"; 

Query query = session.createQuery(selectSql); 
List<Object[]> listUsers = query.list(); 

for (Object[] data : listUsers) 
{ 
    cmbClient.addItem(new ItemCombobox(data[0].toString(), data[1].toString())); 
} 
+0

Votre application de bureau utilise-t-elle Hibernate en interne, ou avez-vous Hibernate sur votre serveur? Est-ce que vous réexécutez la requête périodiquement? Utilisez-vous le cache de requête? –

Répondre

1

ouverture d'essai et la fermeture d'une transaction à chaque fois que vous avez terminé avec une opération

// Non-managed environment idiom Session sess = factory.openSession(); Transaction tx = null; try { 
    tx = sess.beginTransaction(); 

    // do some work 
    ... 

    tx.commit(); } catch (RuntimeException e) { 
    if (tx != null) tx.rollback(); 
    throw e; // or display error message } finally { 
    sess.close(); } 

Voir: https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/transactions.html

0

d'abord tous les thougt:

J'undestand que est parce que la sessionFactory est différente.

est complètement faux. Je préfère que vous lisiez quelques informations sur la façon dont les applications java communiquent avec les bases de données.

Si vous effectuez votre requête, vous récupérez des données de la base de données et vous avez votre copie locale dans la mémoire jvm (machine virtuelle Java). Donc, si vous voulez obtenir une nouvelle copie de données à partir de la base de données, vous devez simplement faire une requête à la base de données une fois de plus (après sur un deuxième ordinateur, ajouter une opération utilisateur), ne pas réinitialiser votre application.

éditer: note: la SessionFactory n'est utilisée qu'une seule fois dans l'application entière.

0

Il est probablement associé à la capture de second niveau Hibernate. Vous pouvez lire à ce sujet here. A partir de ce texte:

cache de second niveau est créé dans la portée de l'usine de session et est disponible pour être utilisé dans toutes les sessions qui sont créées à l'aide de cette usine session particulière. Cela signifie également qu'une fois la fermeture de la session terminée, tous les caches associés à celle-ci disparaissent et le gestionnaire de cache a également fermé .

Vous pouvez désactiver le verrouillage de second niveau, mais vous devez faire attention car cela peut influencer vos performances. Comment configurer la capture de second niveau dans Hibernate, vous pouvez lire here.

+0

il ne devait rien faire avec le cache de second niveau, vous deviez activer le deuxième niveau de mise en cache vous-même –

+0

@karim Comment savez-vous qu'il n'a pas pris le projet après quelqu'un avec cette option déjà activée? – Szarpul