2012-03-02 2 views
0

J'ai une application avec un GUI et une liste de stocks qui sont enregistrés dans un db. J'utilise 1 EntityManager tout le temps que l'application est en cours d'exécution, pour supprimer, modifier et ajouter de nouveaux stocks. J'ai un fil qui saisit périodiquement les stocks réels des stocks et les enregistre dans la DB. J'utilise un autre gestionnaire d'entité dans le thread (cause de la sécurité du thread). Il ressemble à ceci:Modifications de modèle dans une application JPA multithread

// grabbing the actual info and making actualStockPrice with it 
.... 
// adding the correct stock to the new stockprice 
actualStockPrice.setStock(stock); 
// Can't do the next line cause of duplicate primary key 
     //stock.getActualStockPrices().add(actualStockPrice); 
// Saving new price in db 
stockPriceModel.saveActualStockPrice(actualStockPrice); 

J'ai un bouton pour afficher une table avec toutes les stockprices enregistrées d'un stock. Je remplis la table avec stock.getActualStockPrices() mais parce que je n'ai jamais ajouté les nouveaux stockprices au stock, le tableau montre seulement les stockprices qui étaient là au début du programme. Si je ne commente pas le stock.getActualStockPrices(). Add (actualStockPrice); Je reçois une erreur de clé primaire en double dès que j'économise le stock à la DB, cause du nouveau stockprice trouvé dans le stockstocklistList de l'action. Alors que faire :?

Répondre

0

Si le stock est déjà présent dans la base, il donnera une exception. Pour enregistrer uniquement les modifications apportées à l'entité existante, utilisez merge pour le mettre à jour.

De même, configurez le mode de vidage EntityManager à FlushModeType.COMMIT comme AUTO par défaut. Par conséquent stock.getActualStockPrices().add(actualStockPrice) provoque pour refléter les modifications dans la base de données instantanément.

Vous pouvez gérer manuellement la transaction pour mieux contrôler les modifications de la base de données: begin transaction - opérations de base de données - transaction commit/rollback.

+0

Cela semble fonctionner maintenant - merci :) –

+0

@BieneMaja Vous êtes les bienvenus –

+0

J'ai maintenant rencontré un problème avec cela. Dire que mon programme fonctionne depuis longtemps et amassé beaucoup de stockPrices. Si je veux maintenant les voir et que j'appelle fusionner sur le stock, cela peut prendre beaucoup de temps en fonction du nombre de cours des actions (par exemple quelques secondes pour ~ 1000 prix). Donc, plus je ne fusionne pas, plus il faut de temps pour les fusionner (c'est logique). Que puis-je faire contre cela? –

Questions connexes