2013-02-27 65 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。