2012-04-17 4 views
0

に困惑しています。ここエラーです:あなたがたは古風「org.hibernate.NonUniqueObjectException」...私は、この1

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(これらは従業員オブジェクトでもあります)。

@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次のとおりです:ここでNominationある

@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

同じエラーが1回発生しました。それは、1つまたは複数の多くの関係に現れます。オブジェクトが1つのセッションで開かれている主な理由ですが、他のセッションでは別のオブジェクトを参照しています。私はこれがreference助けることを願っています。

+0

ザ・唯一の多対多の関係は指名・ツー・従業員(ノミネート)でお役に立てば幸いです。この関係は私に前もって何の問題も与えておらず、私はその関係を扱う多くの方法を持っています。それはここでしか起こらない。私はこの投稿を投稿する前にも見ましたが、このエラーがスーパー一般になる可能性があるので、私に役立つものは何もありません。問題は、エラーが「会社」を示すオブジェクトを永続化しようとしていないことです。実際、私が「永続化」しようとしている唯一のオブジェクトはノミネートです。いずれにせよ、ありがとう! – Nimchip

0

私はかなりいくつかのことをしようとしているが、どのような作業を終わったことは、この交換した後、これを固定:ようにmerge()

 coworkerNomTxService.update(nom); 

を:

 coworkerNomTxService.merge(nom); 

ます場合、私はうまくいけばここに掲示しています同じエラーが出たら、まずこのメソッドを試してみてください。 CascadeTypeがALLとで設定されているかどうかを確認しないでください。

+0

ところで、なぜあなたは "genUpdateNomination"の内部ではなく、その内部にトランザクションを持っていますか?変更されたデータの読み取りを防止するために、1つのトランザクションで実行されるべき複数のdbアクセス操作があります。 –

+0

このメソッドはサービスクラスの一部であるため、トランザクションクラスをインスタンス化して使用します。私はこれがTXレベルに落ちるかもしれないことを知っていますが、それは私がそれを許すことを選んだサービスに非常に特化しているからです。 – Nimchip

0

最初に行うことは、メソッドコールの前にsession.getStatistics().getEntityKeys()を呼び出して重複オブジェクトがあるかどうかを確認することです。はいの場合は、同じ方法でトレースします。

第2に、更新されたオブジェクトの子コレクション(存在する場合)が同じIDを持っていないことを確認します。

は、それがここに

関連する問題