Transaction doit être d'exception sur exécuter la mise à jour pour JPQL requête de mise à jour
J'ai cette erreur lorsque j'essaie d'exécuter ce code.
Erreur:
javax.la persistance.TransactionRequiredException: executeUpdate n'est pas pris en charge pour un objet de Requête obtenue par le biais de non-accès transactionnel d'un container-managed transactionnelle EntityManager
Code: (_ut est un usertransaction objet)
public void setMainCategory(Entier deptId, Entier catId) {
try {
Query setmain = _entityManager.createNamedQuery("Category.setAsMain");
Query removeMain = _entityManager.createNamedQuery("Category.removeMain");
setmain.setParameter("categoryId", catId);
Department d;
d=_entityManager.find(Department.class, deptId);
removeMain.setParameter("department", d);
_ut.begin();
removeMain.executeUpdate();
_ut.commit();
_ut.begin();
setmain.executeUpdate();
_ut.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
J'ai d'autres fonctions qui sont identiques dans la mise en œuvre et ils ne jetez pas cette erreur.
Toutes les suggestions sont grandement appréciés.
Grâce.
OriginalL'auteur user2233876 | 2013-04-01
Vous devez vous connecter pour publier un commentaire.
Vous utilisez un
EntityManager
pour obtenir les Requêtes Nommées et aussi à l'aide d'un (ce que je pense) injectéUserTransaction
.Voir que le message d'erreur dit "...de Requête objet obtenu par le biais de non-accès transactionnel...". Cela signifie que vous obtenez la "NamedQuery" par le non-accès transactionnel, parce que le
EntityManager
n'est pas dans la même transaction que_ut
. Ainsi, vous rejoindrez leEntityManager
à laUserTransaction
, puis vous obtenez et l'exécution de la requête.Enfin votre bloc devrait ressembler à:
OriginalL'auteur Joe Almore
Le problème ne vient pas de votre méthode de mise en œuvre, mais à partir de votre contexte d'exécution.
Toutes les méthode de mise à jour de la base de données doit être exécutée à l'intérieur d'une ouverture de la transaction. La façon dont vous assurer que dépend la façon dont vous gérer la transaction. Si les transactions sont gérées par l'utilisateur, vous devez explicitement de récupérer et de se joindre à une transaction existante ou d'en ouvrir un nouveau. Si c'est container-managed juste ajouter
@transactional
annotation sur votre méthode ou de s'assurer qu'il y a une méthode dans votre appel de la hiérarchie de la tenue de l'annotation.Ici, vous êtes à l'aide géré par l'utilisateur de transactions dans un container-managed contexte de transaction (voir "container-managed transactionnelle EntityManager" dans votre message d'erreur). Vous ne devriez pas sorte de begin et commit /rollback vous-même les opérations. Si vous souhaitez faire, il suffit de récupérer une application gérée EntityManager pour être en mesure d'accéder correctement aux transactions JTA.
cf. http://docs.oracle.com/cd/E19226-01/820-7627/bnbqy/index.html
OriginalL'auteur Gab
Selon le message d'erreur, je pense que la raison en est que votre commande de transaction, vous n'obtenez pas le Département d dans la transaction, de sorte que la déclaration de d est détachée, alors vous voulez la mettre directement à jour qui va changer l'état pour la gestion, l'APP ne peut pas le faire. il suffit de déplacer le trouver le code dans la transaction, je pense que ça va être ok.
Ouais, exactement. Mais je pense que le projet est un projet ancien qui coûte trop cher à l'utilisation de l'annotation.
OriginalL'auteur OQJF