2012-04-17 12 views
0

這裏的錯誤:葉奧爾德「org.hibernate.NonUniqueObjectException」 ......我難倒就這一個

org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session: [com.project.lmu.data.entity.Company#02K] 
    org.hibernate.engine.StatefulPersistenceContext.checkUniqueness(StatefulPersistenceContext.java:638) 
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:305) 
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:246) 
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:112) 
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) 
    org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685) 
    org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677) 
    org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:252) 
    org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392) 
    org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335) 
    org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204) 
    org.hibernate.engine.Cascade.cascade(Cascade.java:161) 
    org.hibernate.engine.Cascade.cascade(Cascade.java:127) 
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:376) 
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:350) 
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:246) 
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:112) 
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) 
    org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685) 
    org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677) 
    org.hibernate.engine.CascadingAction$5.cascade(CascadingAction.java:252) 
    org.hibernate.engine.Cascade.cascadeToOne(Cascade.java:392) 
    org.hibernate.engine.Cascade.cascadeAssociation(Cascade.java:335) 
    org.hibernate.engine.Cascade.cascadeProperty(Cascade.java:204) 
    org.hibernate.engine.Cascade.cascade(Cascade.java:161) 
    org.hibernate.engine.Cascade.cascade(Cascade.java:127) 
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.cascadeOnUpdate(DefaultSaveOrUpdateEventListener.java:376) 
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performUpdate(DefaultSaveOrUpdateEventListener.java:350) 
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.entityIsDetached(DefaultSaveOrUpdateEventListener.java:246) 
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.performSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:112) 
    org.hibernate.event.def.DefaultSaveOrUpdateEventListener.onSaveOrUpdate(DefaultSaveOrUpdateEventListener.java:93) 
    org.hibernate.impl.SessionImpl.fireSaveOrUpdate(SessionImpl.java:685) 
    org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:677) 
    org.hibernate.impl.SessionImpl.saveOrUpdate(SessionImpl.java:673) 
    com.project.lmu.data.dao.hibernate.AbstractHibernateDAO.saveOrUpdate(AbstractHibernateDAO.java:172) 
    com.project.lmu.data.tx.AbstractTxService.update(AbstractTxService.java:68) 
    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.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:318) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150) 
    org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110) 
    org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) 
    org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202) 
    $Proxy48.update(Unknown Source) 
    com.project.lmu.data.service.impl.CoworkerServiceImpl.genUpdateNomination(CoworkerServiceImpl.java:175) 
    com.project.lmu.controller.coworkerNom.CoworkerController.genUpdateNomination(CoworkerController.java:305) 
    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.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:212) 
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126) 
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578) 
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:900) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:827) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882) 
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:789) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:311) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:116) 
    org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:83) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:101) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:54) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:182) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    org.springframework.security.web.session.ConcurrentSessionFilter.doFilter(ConcurrentSessionFilter.java:125) 
    org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:323) 
    org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:173) 
    org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) 
    org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259) 

現在,這裏是一個的失敗的方法:

public void genUpdateNomination(int nominationId, int statusId, String generalistComment, int generalistId) { 
     CoworkerNom nom = coworkerNomTxService.findById(nominationId); 
     Status status = statusTxService.findById(statusId); 
     if (!(nom.getStatus() == status && nom.getGeneralistComment().equals(generalistComment))) { 
      if (statusId == 2) { 
       //Approved so do email 
      } 

      if (statusId == 3) { 
       //Does Not Proceed so do email 
      } 

      if (statusId == 4) { 
       //Incomplete so do email 
      } 

      Employee generalist = employeeTxService.findById(generalistId); 

      nom.setGeneralist(generalist); 
      nom.setGeneralistComment(generalistComment); 
      nom.setStatus(status); 
      nom.setUpdatedBy(generalist); 
      coworkerNomTxService.update(nom); 
     } 
    } 

現在我已經煮它歸結於實體EmployeeNominationNominatorNominee(它們也是Employee對象)。這裏是Nomination

@Entity(name = "Nomination") 
@Table(name = "NOMINATION") 
@DiscriminatorColumn(name="CATEGORY_CODE", discriminatorType = DiscriminatorType.STRING, length = 1) 
@Inheritance(strategy=InheritanceType.JOINED) 

public /*abstract*/ class Nomination extends AuditableEntity { 

    @Id 
    @Column(name = "NOM_ID", insertable = true, updatable = true, 
      nullable = false) 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    private int id; 

    @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinColumn(name = "NOMINATOR_ID", referencedColumnName = "EMP_ID") 
    @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, 
      org.hibernate.annotations.CascadeType.MERGE}) 
    private Employee nominator = null; 


    @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinColumn(name = "GENERALIST_ID", referencedColumnName = "EMP_ID", nullable = true) 
    @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, 
      org.hibernate.annotations.CascadeType.MERGE}) 
    private Employee generalist = null; 

這裏是Employee

@Entity(name = "Employee") 
@Table(name = "EMPLOYEE") 
public class Employee implements Serializable { 
    @Id 
    @Column(name = "EMP_ID", insertable = true, updatable = false, nullable = false) 
    private int id; 

    @ManyToOne(fetch = FetchType.EAGER, cascade = {CascadeType.PERSIST, CascadeType.MERGE}) 
    @JoinColumn(name = "COMPANY_CODE", referencedColumnName = "COMPANY_CODE") 
    @Cascade({org.hibernate.annotations.CascadeType.SAVE_UPDATE, 
      org.hibernate.annotations.CascadeType.MERGE}) 
    private Company company = null; 

現在這些目標都與我的應用方法TON工作。事實上,我只是在我的最後一個方法/添加中遇到了這個錯誤,以便進入測試/測試用例模式。

讓我知道是否需要粘貼更多的方法。我不知道是什麼原因導致這種情況。這裏唯一的新東西是設置generalist

回答

1

我遇到同樣的錯誤一次。它出現在一對多或多對多的關係中,主要原因是一個對象在一個會話中打開,但在另一個會話中被引用到另一個對象。我希望這reference幫助。

+0

這裏唯一的多對多關係是提名到員工(提名)。這種關係以前沒有給我任何問題,我有很多處理關係的方法。它只發生在這裏。在發佈之前,我也看到了這篇文章,但沒有什麼能幫助我,因爲這個錯誤可能超級通用。問題是我沒有試圖堅持錯誤表示「公司」的對象,實際上我試圖「堅持」的唯一對象是提名。無論哪種方式,謝謝! – Nimchip 2012-04-17 20:16:40

0

我解決了這個問題想了不少事情之後,但什麼結束了工作被替換這樣的:

 coworkerNomTxService.update(nom); 

merge()像這樣:

 coworkerNomTxService.merge(nom); 

我張貼在這裏,所以希望如果你得到相同的錯誤,你會首先嚐試這種方法。如果不嘗試檢查CascadeType是否設置爲ALL和。

+0

順便說一句,爲什麼你有「genUpdateNomination」內的交易,而不是外面呢?您有幾個數據庫訪問操作,應該在一個事務中執行,以防止讀取更改的數據。 – 2012-04-18 14:34:40

+0

該方法是服務類的一部分,所以它在其中實例化事務類並使用它們。我知道這可能會降低到德克薩斯州的水平,但因爲它是非常具體的服務,我選擇讓它。 – Nimchip 2012-04-18 18:04:24

0

我總是做的第一件事是在session.update()方法調用之前調用session.getStatistics().getEntityKeys()並查看是否有任何重複的對象。如果是,則使用相同的方法追蹤它。

其次,請確保您的更新對象的子集合(如果有)沒有相同的ID。

希望它有幫助