2013-02-27 105 views
0

當我通過調用saveListOfPageChooserElement保存對象的List,它拋出以下異常保存列表拋出異常的Hibernate

然而,當我通過調用saveOrUpdate保存單個實例,然後正常工作。

但是爲了提高性能,我想一次保存List批次而不是單個對象。

任何人都可以提出一次保存整個列表有什麼問題嗎?

List<Abc> listabc = widgetCopyDAO 
        .fetchabcByPageId(id); 


    for (Abc abc: listabc) { 
       abc.setLastUpdatedBy(null); 
       abc.setLastUpdatedOn(null); 
       abc.setCreatedBy(widgetCopyDTO.getUserName()); 
       abc.setCreatedOn(new Date()); 
       abc.setPageChooser(new PageChooser(chooser.getId())); 



       abc.setId(0l); 
       issuePageWidgetDAO.saveOrUpdate(abc); 
      } 
// widgetCopyDAO.saveListOfPageChooserElement(listabc); 


public void saveOrUpdate(Abc abc) { 
     if (abc.getId() == 0) { 
      Long id = (Long) this.getHibernateTemplate().save(
        abc); 
      abc.setId(id); 
     } else { 
      this.getHibernateTemplate().update(abc); 
     } 
    } 


public void saveListOfPageChooserElement(
      List<Abc> listabc) { 
     this.getHibernateTemplate().saveOrUpdateAll(listabc); 

    } 

唯一的例外是

org.springframework.orm.hibernate3.HibernateSystemException: identifier of an instance of com.mct.model.Abc was altered from 138 to 0; nested exception is org.hibernate.HibernateException: identifier of an instance of com.mct.model.Abc was altered from 138 to 0 
    at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:676) 
    at org.springframework.orm.hibernate3.HibernateAccessor.convertHibernateAccessException(HibernateAccessor.java:412) 
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:424) 
    at org.springframework.orm.hibernate3.HibernateTemplate.executeWithNativeSession(HibernateTemplate.java:374) 
    at org.springframework.orm.hibernate3.HibernateTemplate.findByCriteria(HibernateTemplate.java:1055) 
    at org.springframework.orm.hibernate3.HibernateTemplate.findByCriteria(HibernateTemplate.java:1048) 
    at com.mct.dao.WidgetCopyDAO.fetchPageChooserWithImagesByChooser(WidgetCopyDAO.java:82) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:307) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:182) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:149) 
    at org.springframework.aop.framework.adapter.ThrowsAdviceInterceptor.invoke(ThrowsAdviceInterceptor.java:126) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
    at org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor.invoke(AfterReturningAdviceInterceptor.java:50) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
    at org.springframework.aop.framework.adapter.MethodBeforeAdviceInterceptor.invoke(MethodBeforeAdviceInterceptor.java:50) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:106) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:204) 
    at $Proxy58.fetchPageChooserWithImagesByChooser(Unknown Source) 
    at com.mct.service.widgethelper.ChooserWidget.copyWidget(ChooserWidget.java:676) 
    at com.mct.service.widgethelper.ChooserWidget.copyAllWidgets(ChooserWidget.java:634) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown 

回答

0

在休眠,則不能設置ID(Autogenrated)manulally像下面。

abc.setId(0l); 

刪除此行再試。

+0

如果我刪除這條線,那麼以前的記錄將被更新。因爲abc有一個id,那麼沒有新記錄會被插入到數據庫中。 – 2013-02-27 11:31:27

1

您設定在列表中的所有對象的HT IDS:

abc.setId(0l); 

而這正是導致錯誤。 您無法自行更改自動生成的ID。

刪除此行。

+0

但我必須清除id,因爲abc有一個id,那麼沒有新記錄將被插入到數據庫中,並且當前記錄將被更新。 – 2013-02-27 11:34:24

+0

如果您使用相同的ID,它將更新當前對象並且不會添加另一個ID。 – BobTheBuilder 2013-02-27 11:43:35

0

的問題似乎是這一行:

abc.setId(0l); 

你清除你從數據庫加載實體的ID。