用hibernateTemplate怎么样根据传入id删除记录??下面怎么不行?
public <T> void delete(Class<T> entityClass, Object entityId) {
delete(entityClass, new Object[]{entityId});
} public <T> void delete(Class<T> entityClass, Object[] entityIds) {
for(Object id : entityIds) {
hibernateTemplate.delete(find(entityClass, entityIds));

}
} public <T> T find(Class<T> entityClass, Object entityId) {
return (T)hibernateTemplate.get(entityClass, (Serializable) entityId);
}

解决方案 »

  1.   

    报以下异常
    org.springframework.orm.hibernate3.HibernateSystemException: Provided id of the wrong type for class com.szy.product.bean.ProductType. Expected: class java.lang.Integer, got class [Ljava.lang.Object;; nested exception is org.hibernate.TypeMismatchException: Provided id of the wrong type for class com.szy.product.bean.ProductType. Expected: class java.lang.Integer, got class [Ljava.lang.Object;
    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.get(HibernateTemplate.java:525)
    at org.springframework.orm.hibernate3.HibernateTemplate.get(HibernateTemplate.java:519)
    at com.szy.product.dao.impl.DaoImpl.find(DaoImpl.java:28)
    at com.szy.product.dao.impl.DaoImpl.delete(DaoImpl.java:23)
    at com.szy.product.dao.impl.DaoImpl.delete(DaoImpl.java:18)
    at com.szy.product.service.impl.ProductServiceImpl.deleteById(ProductServiceImpl.java:39)
    at com.szy.bean.product.ProductTypeTest.testdelete(ProductTypeTest.java:69)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46)
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
    Caused by: org.hibernate.TypeMismatchException: Provided id of the wrong type for class com.szy.product.bean.ProductType. Expected: class java.lang.Integer, got class [Ljava.lang.Object;
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:109)
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:906)
    at org.hibernate.impl.SessionImpl.get(SessionImpl.java:843)
    at org.hibernate.impl.SessionImpl.get(SessionImpl.java:836)
    at org.springframework.orm.hibernate3.HibernateTemplate$1.doInHibernate(HibernateTemplate.java:531)
    at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
    ... 32 more
      

  2.   

     public <T> void delete(Class<T> entityClass, Object[] entityIds) {
            for(Object id : entityIds) {
                hibernateTemplate.delete(find(entityClass, entityIds));
                
            }
        }
    这个东西有问题,里面的find()方法里的第一个参数貌似错了,应该是EntityClass.class
      

  3.   

    LS的朋友,应该不是这个问题,entityClass 就是一个Class。
      

  4.   

    请原谅我的大意,没看到你用的<T>
    原因应该是这个方法第二个参数:
     public <T> T find(Class<T> entityClass, Object entityId) {
            return (T)hibernateTemplate.get(entityClass, (Serializable) entityId);
        }
    你的实体的主键的类型问题。
      

  5.   

     public <T> void delete(Class<T> entityClass, Object[] entityIds) {
            for(Object id : entityIds) {
                hibernateTemplate.delete(find(entityClass, entityIds));
                
            }
        }
    hibernateTemplate->
    super.getHibernateTemplate()?
      

  6.   


    我是用Spring帮我注入的,应该差不多
      

  7.   

    先获得那个实体,然后delete 那个实体
      

  8.   

    貌似调用时参数错误:
    delete(YourEntity, new Integer(1));
      

  9.   


    public <T> void delete(Class<T> entityClass, Object[] entityIds) {
            for(Object id : entityIds) {
                hibernateTemplate.delete(find(entityClass, id));
                
            }
        }我晕了,原来是循环时传的是id。。太粗心了
    谢谢各位的回答。
      

  10.   

    public <T> void delete(Class<T> entityClass, Object[] entityIds) {
    for(Object id : entityIds) {
    hibernateTemplate.delete(find(entityClass, id));
    }
    }
      

  11.   

     for(Object id : entityIds) {
                hibernateTemplate.delete(find(entityClass, entityIds));
                
            }
    明显这一块写错了 for ( id :entityIds )你删除的时候传入的却是 entityIds  而不是 for循环得到的 id所以造成了后面吧一个数组强制转换成 Integer(id) 类型