EJBException lors de l'appel de l'entityManager.getTransaction()
C'est probablement quelque chose de trivial, mais j'aimerais un peu d'aide.
J'obtiens:
javax.ejb.EJBException: java.lang.IllegalStateException: Illegal to call this method from injected, managed EntityManager
11:54:37,105 ERROR [STDERR] at org.jboss.ejb3.tx.Ejb3TxPolicy.handleExceptionInOurTx(Ejb3TxPolicy.java:77)
11:54:37,105 ERROR [STDERR] at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:83)
11:54:37,105 ERROR [STDERR] at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:190)
quand le faire:
@PersistenceContext(unitName = "someName")
private EntityManager em;
...
final EntityManager entityManager = getEntityManager();
final EntityTransaction tx = entityManager.getTransaction(); //here
Quelqu'un peut me dire quelle est la cause pourrait être ?
OriginalL'auteur Simeon | 2011-06-23
Vous devez vous connecter pour publier un commentaire.
Il est illégal d'obtenir une référence à la EntityTransaction instance associée à l'EntityManager dans une Java EE contexte de la gestion. À partir de l'API Java EE documentation de L'EntityManager.getTransaction():
La dernière ligne est pertinente dans ce contexte.
Lorsque vous injectez l'EntityManager dans un EJB déployé sur un serveur d'applications à l'aide de @PersistenceContext ou @Inject annotations, l'EntityManager sera géré par le conteneur et non par l'application. Une gérée par le conteneur gestionnaire d'entité doit être une JTA Entité Gestionnaire; application gérés par les gestionnaires de l'entité peuvent être des ressources locales, les gestionnaires de l'entité. Ceci est dicté par la spécification JPA:
Inférer à partir du premier point (concernant l'exception IllegalStateException), vous ne devez pas obtenir le EntityTransaction de référence pour le conteneur injecté EntityManagers. Vous pouvez toutefois le faire, si le conteneur injecté que l'EntityManagerFactory, et que votre demande a obtenu l'EntityManager de référence en invoquant
EntityManagerFactory.getEntityManager
.En outre, il convient de noter que l'invocation de
EntityManager.getTransaction()
est dénuée de sens pour JTA les gestionnaires de l'entité. Ceci est indiqué par la spécification JPA, dans la définition de la EntityTransaction interface:Sur le thème de la gestion de la transaction JTA lui-même, si vous avez besoin de gérer la transaction limites de soi-même (c'est à dire utiliser bean-managed transactions), à injecter de l'
UserTransaction
instance. Ou si vous souhaitez avoir le conteneur de la gestion de la transaction, alors il suffit d'annoter la méthode ou le haricot, la TransactionalAttribute valeur.Il n'est généralement pas une bonne idée d'utiliser les ressources locales, les gestionnaires de l'entité (et de sources de données) avec bean géré ou gérée par le conteneur des transactions dans un serveur d'application, mais il peut être fait.
Vous permettra de trouver un exemple montrant l'utilisation de l'Ogec avec l'injection de l'EntityManager dans le Hibernate EntityManager documentation. CMTs sont encore plus trivial si vous avez déjà annoté votre fève de classes ou de méthodes; vous devez simplement éviter d'invoquer la
getEntityTransaction()
méthode pour CMTs au travail.Si vous souhaitez comprendre plus loin, je vous recommande la lecture du Chapitre 7 de la JPA 2.0, intitulé "les Gestionnaires de l'Entité et les Contextes de Persistance". Les exemples fournis dans ce chapitre démontrent:
vous êtes les bienvenus. Malheureusement, ma réponse est ambiguë, dans quelques endroits, et pourrait avoir été mal interprétée. Je l'ai mis à jour pour inclure les cas où JTA et les ressources locales, les gestionnaires de l'entité peut être utilisé, et quelles restrictions s'appliqueraient donc sur la
EntityManager.getTransaction()
méthode. Il devrait être plus clair maintenant.Non, c'clarifier les choses parfaitement, merci encore. J'ai effectivement stockés cette réponse de référence pour plus tard 🙂 j'ai réussi à faire ce que je veux avec @TransationAttribute, mais maintenant, je comprends pourquoi l'entityManager.getTransaction(); ne fonctionne pas.
OriginalL'auteur Vineet Reynolds
Vous n'avez pas besoin d'instancier la
EntityManager
à la main, votre conteneur n'a que pour vous en raison de la@PersistenceContext
annotation. Aussi, vous n'avez pas besoin de commencer l'opération manuellement, il est également fourni par votre containter. Il suffit d'utiliser votreem
champ et d'oublier les autres.OriginalL'auteur atamanroman