2010-11-30 19 views
1

Voici ma description du problème.Hibernate Problème (javax.persistence.PersistenceException: org.hibernate.PersistentObjectException)

J'ai 2 objets "A" et "B". "A" a une relation OneToOne (cascadeType = cascadeType.All) avec un autre objet "C". Même "B" a OneToOne (cascadeType = cascadeType.All) relation avec "C".

Maintenant, je dois persister l'objet "A". Et après avoir persisté l'objet "A", je dois persister l'objet "B". Je peux persister avec succès l'objet "A", mais quand je persiste " B » je reçois l'exception

javax.persistence.PersistenceException: org.hibernate.PersistentObjectException 

la raison est déjà l'objet « C » est persista lorsque « A » est persisted.And quand « B » est persistait il essaie aussi de persister « C » à nouveau .Thats pourquoi persistenceException.

J'ai essayé de fusionner l'objet C avant de persister l'objet "B". Même alors, je reçois la même exception.

S'il vous plaît me fournir un travail autour.

Aussi laissez-moi savoir si quelqu'un a besoin de plus amples informations.

Voici la pile complète Trace

 
    Caused by: javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.project.shared.entity.User 
     at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1235) 
     at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1168) 
     at org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1174) 
     at org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:674) 
     at com.sun.enterprise.container.common.impl.EntityManagerWrapper.persist(EntityManagerWrapper.java:258) 
     at com.project.server.bean.ExpertFacade.create(ExpertFacade.java:64) 
     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 org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052) 
     at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124) 
     at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5243) 
     at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:615) 
     at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797) 
     at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:567) 
     at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:157) 
     at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:139) 
     at sun.reflect.GeneratedMethodAccessor64.invoke(Unknown Source) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
     at java.lang.reflect.Method.invoke(Method.java:597) 
     at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:858) 
     at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797) 
     at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:367) 
     at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5215) 
     at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5203) 
     at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:190) 
     ... 69 more

Merci

+1

Pouvez-vous fournir toute stacktrace, s'il vous plaît? – kraftan

+0

Oui, j'ai édité ma question et collé la trace de la pile. – Barry

Répondre

4

Une entité indépendante est une entité qui a un identifiant, mais n'est pas présent dans la session en cours. Lorsque vous essayez de le sauvegarder, Hibernate se plaint. Vous devez le remettre dans la session. Ceci est fait via entityManager.merge(..).

+0

J'ai fusionné l'objet "C" avant de persister l'objet "B". ce que j'ai fait est getEntityManager(). merge (Object "B" .get "C"); puis getEntityManager(). persist (Object "B"); Pourtant, je rencontre la même exception – Barry

+1

fusion B ainsi - il semble qu'il est l'objet détaché (bien que cascade = tout inclut 'fusionner', en ce moment je ne peux pas me concentrer sur votre scénario exact) – Bozho

2

j'ai eu la même exception ci-dessous:

Exception in thread "SimpleAsyncTaskExecutor-2" javax.persistence.PersistenceException: org.hibernate.PersistentObjectException: detached entity passed to persist: com.tea.domain.User 

Lorsque j'ai modifié l'objet utilisateur comme ci-dessous, je n'ai pas l'exception:

@Override 
    public void samplePull(Application application, User user) { 

     user = userDao.findUser(user.getId()); 
     more code below..... 

     }