2012-04-17 2 views
0

Вот ошибка:Ye Olde "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); 
     } 
    } 

Теперь я вареные оно относится к объектам Employee и NominationNominator и Nominee (которые также являются объектами 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; 

Теперь эти объекты работали с тонной методов в моих приложениях. Фактически, я просто столкнулся с этой ошибкой в ​​моем последнем методе/добавлении, чтобы перейти в режим тестирования/тестовых случаев.

Дайте мне знать, если мне нужно вставить больше методов. Я понятия не имею, что может вызвать это. Единственное новое здесь - установка generalist.

ответ

1

Однажды я столкнулся с той же ошибкой. Он встречается во многих отношениях с одним или несколькими, основная причина заключается в том, что объект открыт в одном сеансе, но на другом объекте он ссылается на другой объект. Надеюсь, это поможет reference.

+0

Единственных многие ко-многие здесь являются Выдвижение к Employee (Кандидаты). Эти отношения не дали мне никаких проблем раньше, и у меня есть много методов, которые касаются отношений. Это происходит только здесь. Я также видел этот пост перед публикацией, но мне ничего не помогает, потому что эта ошибка может быть супер общей. Проблема в том, что я не пытаюсь сохранить объект, который указывает на ошибку «Компания», на самом деле единственным объектом, который я пытаюсь «сохранить», является Номинация. В любом случае, спасибо! – Nimchip

0

я это исправил после попытки довольно много вещей, но то, что в конечном итоге работает заменял это:

 coworkerNomTxService.update(nom); 

с merge(), как так:

 coworkerNomTxService.merge(nom); 

Я отправляю здесь так что надеюсь, если вы получите ту же ошибку, что и вы сначала попробуете этот метод. Если не пытаться проверить, установлен ли параметр CascadeType на ВСЕ и.

+0

Кстати, почему у вас есть транзакция внутри «genUpdateNomination», а не за ее пределами? У вас есть несколько операций с db-доступом, которые должны выполняться в одной транзакции, чтобы предотвратить чтение измененных данных. –

+0

Метод является частью класса сервиса, поэтому он создает в нем классы транзакций и использует их. Я знаю, что это может быть сбит до уровня TX, но поскольку это очень специфично для службы, которую я выбрал, пусть это будет. – Nimchip

0

Первое, что я всегда делаю, это позвонить session.getStatistics().getEntityKeys() перед вызовом метода session.update() и посмотреть, есть ли дублирующий объект. Если да, проследите его, используя тот же метод.

Во-вторых, убедитесь, что коллекция детских объектов обновленных объектов (если есть) не имеет одинакового идентификатора.

Надеется, что это помогает

Смежные вопросы