7
votes

EntityManager jette transactionRequiredException sur fusion () dans JBoss JSF Bean

J'ai configuré une application JSF sur JBoss 5.0.1ga pour présenter une liste d'utilisateurs dans une table et permettre la suppression des utilisateurs individuels via un bouton à côté de chaque utilisateur.

Lorsque DeleteUserer est appelé, l'appel est transmis à un utilisateurDaobean qui obtient un EntityManager injecté de JBoss.

J'utilise le code xxx

pour supprimer l'utilisateur (le code était C & P d'un Didacticiel JPA). Il suffit d'appeler em.ReMove (entité) n'a aucun effet et provoque toujours la même exception.

Lorsque cette ligne est atteinte, je reçois une transactionQuitéException:

(sauter apparemment sans importance -stus)

...

20: 38: 06.406 Erreur [[Faces Servlet]] Servlet.service () pour faces de servlet Servlet a jeté une exception javax.persistence.TransActionActionRequiredException: EntityManager doit être accès dans un transaction à org.jboss.jpa.deployment.ManagedentityManagerFactory.verifyintX (GestionEdentityManagerFactory.java:155) à org.jboss.jpa.tx.transactionsCopedentityManager.merge (transactionsCopedentityManager.java:192) à at.fhj.itm.utils.daoimpltemplate.delete (daoimpltemplate.java:54) à at.fhj.itm.userbean.delete (userbean.java:53) à sun.reflect.natiftemethodaccessorimpl.invoke0 (natif Méthode)

...

J'ai déjà essayé d'envelopper une transaction gérée manuellement (em.getTransaction (). Commencez () + .Commouver ()) autour de lui, mais cela a échoué car il n'est pas autorisé dans le conteneur JBoss. Je n'avais aucun succès avec UserTransaction non plus. Les recherches sur le Web pour ce numéro sont également activées sans cas et solution similaire.

Quelqu'un a-t-il expérimenté quelque chose de similaire avant et trouvé une solution à cela?


4 commentaires

"J'ai déjà essayé d'envelopper une transaction autour de lui, mais cela a échoué car il n'est pas autorisé dans le conteneur JBoss." - Qu'est-ce qui n'est pas autorisé? Transactions? Pas vrai. S'il vous plaît mettre à jour et expliquer cela plus pleinement.


Et pourquoi pensez-vous qu'il est nécessaire de fusionner avant de retirer un objet? Si quelque chose ne va pas, je ne suis pas d'accord avec ça.


Clarifié (j'espère). Je voulais dire gérer manuellement des transactions sur l'entitémanager. En outre, le Supprimer (fusion ()) est présent dans des exemples sur tout le Web (même pour Oracle). Néanmoins, j'ai essayé une simple suppression qui provoque toujours la même exception.


Je ne pense pas que je recommanderais que la fusion. Sortez-le et voyez si votre situation s'améliore.


4 Réponses :


1
votes

Êtes-vous sûr de vous dire que vous avez annoté votre haricot avec @Statoire ou enregistrez-le avec XML?

Essayez Ajouter une annotation de transaction à votre code, cela peut vous aider: P>

@TransactionAttribute(REQUIRED)
public void delete(E entity)
{
        em.remove(em.merge(entity));
}


4 commentaires

Pas de chance avec ce @TransActionAttribute non plus :( Le haricot n'est pas annoté avec @Statoire mais l'entitémanager est avec @persistencecontext (UNITNAME = "TEST). Quand j'ajoute le @ SatSatOless à la classe, l'entitémanager n'est plus injecté mais NULL.


L'EJB crée automatiquement une transaction au début de tout appel de méthode Ejbean. Par conséquent, si vous n'utilisez pas de EJB ( @Statoire , @Local , etc., avec le conteneur associé) Vous devrez créer votre propre transaction.


Si vous voulez que votre haricot était DAO, il est préférable que vous l'annotant avec @Statoire et utilisez une interface @Local pour cela. Parce que si si le haricot n'est pas sans faille ou @statefull, alors il n'est pas un haricot EJB, et la transaction n'est pas gérée comme par exemple. De plus, si vous êtes neuf en EJB, jetez un coup d'œil à son livre "Enterprise JavaBeans, 3.0" par Bill Burke, Richard Monson-Haefel


+1 Car vous êtes-vous sûr que vous avez annoté votre haricot avec @Statoire ou enregistrez-le avec XML?



8
votes

a trouvé le lien manquant.

C'était en effet une transaction manquante, mais la solution n'était pas d'utiliser l'entitémanager pour le gérer, mais d'ajouter une maîtrise utilisateur injectée. P>

@Resource
UserTransaction ut;
...
public void delete(E entity)
{
        ut.begin();
        em.remove(em.merge(entity));
        ut.commit();
}


2 commentaires

Il n'est pas très judicieux de contrôler la transaction manuellement, c'est que vous coportez plus Verbose, Java2ee Server peut le faire pour vous. Pourquoi n'utilisez-vous pas d'annotations pour cela?


Parce que j'ai essayé. J'ai essayé très fort de trouver une annotation et un réglage qui fonctionne. J'ai essayé d'innombrables variations de @Statoire, @stateful, @Local, @TransactionAttribute, etc., dont aucun n'a travaillé et que dans la plupart des cas, l'entitémanager ne soit plus injecté. Je n'ai vraiment aucune idée, ce qui cause cela parce que mes expériences précédentes avec Hibernate font exactement comme vous le disent et laissez le conteneur gérer les transactions. Néanmoins, il semble être différent avec JPA et JSF et puisque cette solution est facile et utilisée uniquement pour supprimer et ajouterai, je resterai avec elle et ne pas passer plus de temps dessus.



2
votes

sais que c'est une ancienne question, mais juste au cas où quelqu'un trébuche sur ce comme moi.

Essayez xxx

C'est ce que nous utilisons dans tous nos @statful haricots .

Si vous utilisez une couture, vous pouvez également utiliser @Transactional (transactionpropagationtype.requiked) Annotation.


0 commentaires

0
votes

Juste une note: nous avons rencontré ce même problème aujourd'hui, il s'est avéré que quelqu'un avait marqué l'EJB comme transacattribuetype.not_supporté et la méthode comme transactatributetype.Required, provoquant l'échec du manque de transaction.


0 commentaires