用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);
}
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);
}
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
for(Object id : entityIds) {
hibernateTemplate.delete(find(entityClass, entityIds));
}
}
这个东西有问题,里面的find()方法里的第一个参数貌似错了,应该是EntityClass.class
原因应该是这个方法第二个参数:
public <T> T find(Class<T> entityClass, Object entityId) {
return (T)hibernateTemplate.get(entityClass, (Serializable) entityId);
}
你的实体的主键的类型问题。
for(Object id : entityIds) {
hibernateTemplate.delete(find(entityClass, entityIds));
}
}
hibernateTemplate->
super.getHibernateTemplate()?
我是用Spring帮我注入的,应该差不多
delete(YourEntity, new Integer(1));
public <T> void delete(Class<T> entityClass, Object[] entityIds) {
for(Object id : entityIds) {
hibernateTemplate.delete(find(entityClass, id));
}
}我晕了,原来是循环时传的是id。。太粗心了
谢谢各位的回答。
for(Object id : entityIds) {
hibernateTemplate.delete(find(entityClass, id));
}
}
hibernateTemplate.delete(find(entityClass, entityIds));
}
明显这一块写错了 for ( id :entityIds )你删除的时候传入的却是 entityIds 而不是 for循环得到的 id所以造成了后面吧一个数组强制转换成 Integer(id) 类型