JPA Aucune transaction n'est actuellement active
En utilisant JPA avec EclipseLink mise en œuvre.
Code:
try{
if(!em.getTransaction().isActive())
em.getTransaction().begin();
System.out.println(2);
em.persist(currentUser);
System.out.println(3);
if (em.getTransaction().isActive()){
System.out.println("IS ACTIVE");
} else {
System.out.println("NO ACTIVE");
}
em.getTransaction().commit();
System.out.println(4);
} catch (Exception e){
completed = false;
em.getTransaction().rollback();
System.out.println("ERROR: " + e.getMessage());
}
Erreur:
INFO: persistOne - Enter
INFO: 2
INFO: 3
INFO: IS ACTIVE
INFO: [EL Warning]: 2012-01-06 14:45:59.221--UnitOfWork(12492659)--java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: com.maze.model.UserDetail@d52ea.
WARNING: #{accountController.performRegister}: java.lang.IllegalStateException:
Exception Description: No transaction is currently active
javax.faces.FacesException: #{accountController.performRegister}: java.lang.IllegalStateException:
Exception Description: No transaction is currently active
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:118)
at javax.faces.component.UICommand.broadcast(UICommand.java:315)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1539)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:281)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:98)
at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:91)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:162)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:330)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:174)
at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:828)
at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:725)
at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1019)
at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:225)
at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104)
at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90)
at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79)
at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54)
at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59)
at com.sun.grizzly.ContextTask.run(ContextTask.java:71)
at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532)
at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513)
at java.lang.Thread.run(Thread.java:662)
Caused by: javax.faces.el.EvaluationException: java.lang.IllegalStateException:
Exception Description: No transaction is currently active
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:102)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
... 32 more
Caused by: java.lang.IllegalStateException:
Exception Description: No transaction is currently active
at org.eclipse.persistence.internal.jpa.transaction.EntityTransactionImpl.rollback(EntityTransactionImpl.java:122)
at com.maze.service.UserService.persistOne(UserService.java:63)
at com.maze.controller.request.AccountController.performRegister(AccountController.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at com.sun.el.parser.AstValue.invoke(AstValue.java:234)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
... 33 more
La chose étrange est que la Transaction est active, mais la prochaine chose est une erreur d'inactivité.
MODIFIER
EntityManager Singleton:
public class EntityManagerSingleton {
private EntityManagerSingleton(){
}
private static class EMSingletonHolder{
private static final EntityManagerFactory emf = Persistence.createEntityManagerFactory("Maze");
private static final EntityManager em = emf.createEntityManager();
}
public static EntityManager getInstance(){
return EMSingletonHolder.em;
}
*Pour obtenir de l'em Exemple: *
public abstract class AbstractService {
protected EntityManager em;
public AbstractService(){
em = EntityManagerSingleton.getInstance();
}
}
Tous les autres services s'étend de la AbstractService
Je ferais attention à ce -
Vous pouvez trouver ma solution à cette adresse.
During synchronization a new object was found through a relationship that was not marked cascade PERSIST
.Vous pouvez trouver ma solution à cette adresse.
OriginalL'auteur TGM | 2012-01-06
Vous devez vous connecter pour publier un commentaire.
À en juger par votre journal, vous êtes à l'aide de GlassFish. Je suppose que vous êtes aussi à l'aide de JTA. Peut-être que vous pouvez fournir également le code qui obtient l'EntityManager exemple? Aussi, le débogage du Système.une déclaration est une chose du passé, l'utilisation d'un débogueur, sinon ton code est difficile à lire. En plus, ton indentation est faux.
Tout d'abord, si vous utilisez JTA, jetez un oeil à cette question:
EJBException lors de l'appel de l'entityManager.getTransaction()
Citation de la accepté de répondre:
Qui est pourquoi si vous vous attendez à aucune aide, il est important de fournir des informations sur le code de l'injection à travers lequel vous obtenir le gestionnaire de l'entité.
Aussi, par souci de lisibilité du code, vous ne devriez pas avoir de multiples appels à l'em.getTransaction();
Vous devez affecter votre premier appel pour un objet de la Transaction et de la réutiliser, un peu comme ceci:
et pas
Le dernier point de votre post semble être erronée dans le contexte de ressources locales, les gestionnaires de l'entité. Il n'y a pas de raison de ne pas appeler getTransaction plusieurs fois afin d'obtenir la transaction en cours. L'EntityManager est mono-thread et le spec explicitement montre un exemple qui fait de cette façon.
J'étais signification en termes de lisibilité du code. Pensez vous avez besoin de persister un peu plus de 4 objets. Voulez-vous appeler 'em.getTransaction().persist(someObject)' 4 fois plus? Ou préférez-vous le " tx.persist(someObject)'? Dans la première approche, chacune de ces lignes de lire que le fait de faire 2 actions: obtenir la transaction, persister l'objet. Alors qu'en fait, ce que vous voulez dire, c'est 'persist l'objet".
la transaction est une partie de l'EntityManager et vous persistez avec l'EntityManager pas à la Transaction. em.getTransaction().begin(); em.persist(obj1); em.persist(obj2); em.getTransaction().commit();
peu importe, si dans le code, vous avez de restauration, ou des trucs comme ça, il ressemble beaucoup plus propre de la transaction instance une fois au lieu de faire de l'em.getTransaction().X. Il est beaucoup plus lisible et suggère que nous appelons la transaction, et non pas de l'em. Je maintiens ce que j'ai dit, c'est beaucoup mieux en termes de lisibilité pour affecter la transaction de quelque chose, et puis le réutiliser, même si nous parlons de deux reusages. L'OP du code est un exemple clair de la façon dont les choses ne doit pas regarder et à part le formatage et d'autres choses, il serait bénéfique si elle est faite dans la façon dont je l'ai suggéré.
OriginalL'auteur Nikola Yovchev
Noter que la dernière exception est levée par
rollback()
dans le bloc catch.Donc,
commit()
jette l'exception suivante:Cette exception provoque un rollback implicite, de sorte que le manuel
rollback()
dans le bloc catch jette une autre exception en raison inactif transaction.Pour la fiabilité de nettoyage manuel, vous devez vérifier si la transaction est active avant d'appeler
rollback()
dans le bloc catch.OriginalL'auteur axtavt
Bien, vos journaux expliquer, au cours de validation, Eclipselink obtenu une exception et de restauration de votre transaction. C'est pourquoi votre opération n'est plus actif..
OriginalL'auteur Gursel Koca
Si vous regardez la dernière de ces traces de pile, je vois
C'est une erreur lors de l'annulation, pas de cours de validation. Je me demande si cela est lié à l'avertissement sur la nonpersisted objet; quelque chose se passe mal lors de la fin de la commettre de tels que votre cadre tente une restauration à un point où il est trop tard pour le faire. Je parie que si vous avez correctement enregistré que
UserDetail
objet, le problème serait clair.OriginalL'auteur Ernest Friedman-Hill