hibernate 是用spring 管理的
hbm.xml 配置文件类
<hibernate-mapping>
<class name="com.adito.bean.ExplorerProperties"
table="explorer_properties" catalog="explorer_configuration">
<composite-id name="id" class="com.adito.bean.ExplorerPropertiesId">
<key-property name="key1" type="java.lang.String">
<column name="KEY_1" not-null="true" />
</key-property>
<key-property name="key2" type="java.lang.String">
<column name="KEY_2" not-null="true" />
</key-property>
</composite-id>
<property name="key3" type="java.lang.String">
<column name="KEY_3" not-null="true"/>
</property>
<property name="key4" type="java.lang.String">
<column name="KEY_4" not-null="true"/>
</property>
<property name="key5" type="java.lang.String">
<column name="KEY_5" not-null="true"/>
</property>
<property name="value" type="java.lang.String">
<column name="value" not-null="true"/>
</property>
</class>
</hibernate-mapping>
由于数据库表 没有主键  所有hibernate自动将所有字段都设为复合主键 我把它修改为 将key1 和key2作为复合主键
getHibernateTemplate().save(entity); 是可以的 
getHibernateTemplate().update(entity); 就不行了 总是报
Exception in thread "main" org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1; nested exception is org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
at org.springframework.orm.hibernate3.SessionFactoryUtils.convertHibernateAccessException(SessionFactoryUtils.java:657)
at org.springframework.orm.hibernate3.HibernateTransactionManager.convertHibernateAccessException(HibernateTransactionManager.java:738)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:614)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:709)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:678)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:321)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:116)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:171)
at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:635)
at com.adito.service.JDBCActiveDirectoryService$$EnhancerByCGLIB$$9e0afad4.toPropertyProfilesDaoUpdate(<generated>)
at com.adito.service.JDBCActiveDirectoryService.main(JDBCActiveDirectoryService.java:156)
Caused by: org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1
at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61)
at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46)
at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68)
at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48)
at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:237)
at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:142)
at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:27)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at org.springframework.orm.hibernate3.HibernateTransactionManager.doCommit(HibernateTransactionManager.java:606)
... 8 more
异常   各位帮我看看   急求帮助!!

解决方案 »

  1.   

    关于Hibernate的 Batch update returned unexpected row count from update异常 
    ERROR [http-8080-Processor22] (BatchingBatcher.java:60) - Exception executing batch: 
    org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
     
    1).使用的是hibernate的saveOrUpdate方法保存实例。saveOrUpdate方法要求ID为null时才执行SAVE,在其它情况下执行UPDATE。在保存实例的时候是新增,但你的ID不为null,所以使用的是UPDATE,但是数据库里没有主键相关的值,所以出现异常。=================================================================
    异常:
    在插入时:
    org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1 
    解决方法:
    如果是自增主键?
    有的数据库是可以修改自增主键例如:mysql,有的数据库是不允许修改自增主键的例如postgresql
    不要设置自增主键的值2)
    在Hibernate映射一对多,多对一,多对多的时候新增常常会出现这个异常,代码如下:public void saveFunctionCell(FunctionCell functionCell, Integer pid) {
      System.out.println("现在进行新增操作");
      FunctionCell fc = new FunctionCell();
        try {
       BeanUtils.copyProperties(fc, functionCell);
      } catch (IllegalAccessException e) {
       e.printStackTrace();
      } catch (InvocationTargetException e) {
       e.printStackTrace();
      }
      fc.setFuncCellID(null);
      // 获得父权限
      FunctionCell pfc = functionCellDao.findFunctionCellByID(pid);
      fc.setParentFunctionCell(pfc);
      functionCellDao.saveFunctionCell(fc);
     }
    注意特别标识出来的这个地方,BeanUtils拷贝Bean属性的时候,它会将你的Integer类型全部设置成0,在这里设置一个空,这样就不会抛出错误了。
      

  2.   

    由于数据库表 没有主键 所有hibernate自动将所有字段都设为复合主键 我把它修改为 将key1 和key2作为复合主键
    getHibernateTemplate().save(entity); 是可以的  
    getHibernateTemplate().update(entity); 就不行了 总是报错添加是可以的    只是修改报错
      

  3.   

    你能保证要update的对象在数据库中已经存在么?