【问题标题】:Hibernate Problem ( javax.persistence.PersistenceException: org.hibernate.PersistentObjectException)休眠问题(javax.persistence.PersistenceException: org.hibernate.PersistentObjectException)
【发布时间】:2011-05-18 03:51:00
【问题描述】:

这是我的问题描述。

我有 2 个对象“A”和“B”。“A”与另一个对象“C”有 OneToOne(cascadeType= cascadeType.All) 关系。甚至“B”也有 OneToOne(cascadeType = cascadeType.All) 关系用“C”。

现在我需要持久化对象“A”。在持久化对象“A”之后,我需要持久化对象“B”。我可以成功持久化对象“A”,但是当我持久化对象“B”时“我得到了例外

javax.persistence.PersistenceException: org.hibernate.PersistentObjectException

原因是当“A”被持久化时,对象“C”已经被持久化。而当“B”被持久化时,它也试图再次持久化“C”。这就是persistenceException的原因。

我尝试在持久化对象“B”之前合并对象 C。即使这样我得到了相同的异常。

请为我提供解决方法。

如果有人需要任何进一步的信息,请告诉我。

这是完整的堆栈跟踪

引起:javax.persistence.PersistenceException:org.hibernate.PersistentObjectException:分离的实体传递给坚持:com.project.shared.entity.User 在 org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1235) 在 org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1168) 在 org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1174) 在 org.hibernate.ejb.AbstractEntityManagerImpl.persist(AbstractEntityManagerImpl.java:674) 在 com.sun.enterprise.container.common.impl.EntityManagerWrapper.persist(EntityManagerWrapper.java:258) 在 com.project.server.bean.ExpertFacade.create(ExpertFacade.java:64) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052) 在 org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124) 在 com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5243) 在 com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:615) 在 com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797) 在 com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:567) 在 com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:157) 在 com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:139) 在 sun.reflect.GeneratedMethodAccessor64.invoke(未知来源) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597) 在 com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:858) 在 com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797) 在 com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:367) 在 com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5215) 在 com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5203) 在 com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:190) ... 69 更多

谢谢

【问题讨论】:

  • 能否提供完整的堆栈跟踪信息?
  • 是的,我编辑了我的问题并粘贴了堆栈跟踪。

标签: hibernate jpa persistence


【解决方案1】:

分离实体是具有标识符但不存在于当前会话中的实体。当您尝试保存它时,hibernate 会抱怨。您必须将其放回会话中。这是通过entityManager.merge(..) 完成的。

【讨论】:

  • 我在持久化对象“B”之前合并了对象“C”。我所做的是getEntityManager().merge(Object"B".get"C");然后getEntityManager().persist(Object"B");我仍然遇到同样的异常
  • merge B 以及 - 它似乎是分离的对象(虽然 cascade=all 包括“合并”,但现在我无法专注于您的确切场景)
【解决方案2】:

我在下面遇到了同样的异常:

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

当我如下修改用户对象时,我没有得到异常:

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

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

      }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 2012-09-17
    • 2010-11-20
    • 2021-02-25
    相关资源
    最近更新 更多