2011-03-11 5 views
3

De mon application cliente, je souhaite appeler stocker et actualiser dans une méthode EJB au lieu de deux appels à deux méthodes. J'ai fait une méthode EJB, fait appel aux deux autres méthodes EJB et il semble simple, comme ceci:Stockez et actualisez l'objet avec le problème EJB 2.0 et JPA (Toplink)

public ZippedObjectWrapper saveAndRefresh(final Item p_item) { 
    Long itemSavedId= save(p_item); 
    return refresh(itemSavedId); 
    } 

Le problème est Toplink qui ne me laisse pas lire les données et dans la partie de rafraîchissement génère une exception :

Exception [TOPLINK-7123] Exception Description: Un writeChanges() réussi a été appelé sur ce UnitOfWork. Comme le processus de validation a été démarré mais pas encore finalisé, les seules opérations supportées sont maintenant commit, commitAndResume, release, toute requête de niveau non objet ou exécution SQLCall. L'opération executeQuery (ObjectLevelReadQuery) n'est pas autorisée pour le moment.

Des suggestions?

EDIT: signatures de méthodes modifiées.

+0

Veuillez utiliser les noms de variables anglais. Ceci est impossible à lire pour la majorité des utilisateurs SO. – atamanroman

+0

Comment gérez-vous les transactions? – axtavt

+0

Comment voulez-vous dire exactement? – Andrija

Répondre

0

Le problème est dans Toplink, en particulier la façon dont il gère les opérations de base de données dans la version que nous utilisons. Il existe une solution partielle lorsque vous étendez une classe Toplink, ou mieux, mettez à niveau Toplink :)

1

Vous ne savez pas exactement ce que votre méthode save() fait, mais je suppose que vous appelez writeChanges() sur votre UnitOfWork. Les requêtes n'étaient pas autorisées après writeChanges() dans la version que vous utilisez. Supprimer le writeChanges() devrait résoudre le problème.

Si vous effectuez une mise à niveau vers EclipseLink et JPA, vous pouvez utiliser flush() plusieurs fois dans une transaction et une requête après. Vous pouvez également utiliser maually RepeatableWriteUnitOfWork au lieu de UnitOfWork pour activer plusieurs appels à writeChanges() et autoriser l'interrogation.