我正在使用SpringMVC在带有Spring的应用程序上工作,遇到以下错误,我不知道如何处理。
现在我在控制台中收到此消息:
org.hibernate.TypeMismatchException: Provided id of the wrong type. Expected: class java.lang.Integer, got class java.lang.String at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:86) at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878) at org.hibernate.impl.SessionImpl.load(SessionImpl.java:795) at org.hibernate.impl.SessionImpl.load(SessionImpl.java:788) 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.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:301) at com.sun.proxy.$Proxy11.load(Unknown Source) at com.my.dao.DepartementImplDB.getDepartementByNom(DepartementImplDB.java:54) at com.my.dao.DepartementImplDB.addDepartement(DepartementImplDB.java:29) at com.my.service.DepartementImplMetier.create(DepartementImplMetier.java:57) at com.my.controller.ImportController.Read(ImportController.java:279) 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.web.bind.annotation.support.HandlerMethodInvoker.doInvokeMethod(HandlerMethodInvoker.java:710) at org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:167) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:414) at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:402) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:771) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:716) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:647) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:563) at javax.servlet.http.HttpServlet.service(HttpServlet.java:648) at javax.servlet.http.HttpServlet.service(HttpServlet.java:729) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478) at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Unknown Source)
这是我的ImportController类
/** * @author Ilias */ package com.my.controller; //import ... import com.my.dao.Departement; @Controller public class ImportController { DepartementImplMetier dbD = new DepartementImplMetier(); @RequestMapping(value="/read") public String Read(Model model,@RequestParam CommonsMultipartFile[] fileUpload) throws IOException, EncryptedDocumentException, InvalidFormatException, java.text.ParseException { liste = extraire(modelnom); for(int m=0, i=29;i<liste.size();i=i+29){//i=i+29 Employe employe= new Employe(); Departement departement = new Departement(); if(i % 29 == 0) m++; //... Some code here String dep = (String)liste.get(29*m+13).toString(); Departement d = new Departement(); departement.setNomDepartement(dep); boolean bool=true; List<Departement> departements = dbD.getAll(); boolean depbool = true; for(int j=0;j< departements.size();j++){ if(departements.get(j).getNomDepartement() == dep ) { depbool = false; } if(depbool){ try { dbD.create(departement); } catch (Throwable e) { e.printStackTrace(); } } } for(int n=0;n<employes.size();n++){ if(employes.get(n).getMatriculeMY() == (int)mat ) { bool= false; } } if(bool){ try { dbD.create(departement); dbE.create(employe); } catch (Throwable e) { e.printStackTrace(); } } } } return "redirect"; }} }
这是我的Employe.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 5 ao?t 2015 11:05:44 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="com.my.dao.Employe" table="EMPLOYE"> <id name="id" type="int"> <column name="ID" /> <generator class="native" /> </id> <property name="nomEmploye" type="java.lang.String"> <column name="NOMEMPLOYE" /> </property> <property name="prenomEmploye" type="java.lang.String"> <column name="PRENOMEMPLOYE" /> </property> <property name="matriculeMY" type="int"> <column name="MATRICULEMY" /> </property> <property name="adresse" type="java.lang.String"> <column name="ADRESSE" /> </property> <property name="sexe" type="java.lang.String"> <column name="SEXE" /> </property> <property name="cin" type="java.lang.String"> <column name="CIN" /> </property> <property name="dateNaissance" type="java.lang.String"> <column name="DATENAISSANCE" /> </property> <property name="situationFamiliale" type="java.lang.String"> <column name="SITUATIONFAMILIALE" /> </property> <property name="dateEntree" type="java.lang.String"> <column name="DATEENTREE" /> </property> <property name="dateSortie" type="java.lang.String"> <column name="DATESORTIE" /> </property> <property name="numCIMR" type="java.lang.String"> <column name="NUMCIMR" /> </property> <property name="numCNSS" type="java.lang.String"> <column name="NUMCNSS" /> </property> <property name="numMUT" type="java.lang.String"> <column name="NUMMUT" /> </property> <property name="profile" type="java.lang.String"> <column name="PROFILE" /> </property> <property name="resteConge" type="java.lang.String"> <column name="RESTECONGE" /> </property> <property name="banque" type="java.lang.String"> <column name="BANQUE" /> </property> <property name="numCpteBanc" type="java.lang.String"> <column name="NUMCPTEBANC" /> </property> <!-- <property name="fonction" type="java.lang.String"> <column name="FONCTION" /> </property> --> <property name="salaire" type="float"> <column name="SALAIRE" /> </property> <property name="indTransport" type="float"> <column name="INDTRANSPORT" /> </property> <property name="indRepresent" type="float"> <column name="INDREPRESENT" /> </property> <property name="indPanier" type="float"> <column name="INDPANIER" /> </property> <many-to-one name="eDepartement" class="com.my.dao.Departement" access="field" fetch="join"> <column name="EDEPARTEMENT" /> </many-to-one> <many-to-one name="eFonction" class="com.my.dao.Fonction" access="field" fetch="join"> <column name="EFONCTION" /> </many-to-one> <many-to-one name="eService" class="com.my.dao.Service" access="field" fetch="join"> <column name="ESERVICE" /> </many-to-one> <many-to-one name="eTypePaiement" class="com.my.dao.TypePaiement" access="field" fetch="join"> <column name="ETYPEPAIEMENT" /> </many-to-one> <many-to-one name="eModePaiement" class="com.my.dao.ModePaiement" access="field" fetch="join"> <column name="EMODEPAIEMENT" /> </many-to-one> </class> </hibernate-mapping>
这是我的Departement.hbm.xml
<?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 5 ao?t 2015 11:05:44 by Hibernate Tools 3.4.0.CR1 --> <hibernate-mapping> <class name="com.my.dao.Departement" table="DEPARTEMENT"> <id name="id" type="int"> <column name="ID" /> <generator class="native" /> </id> <property name="nomDepartement" type="java.lang.String"> <column name="NOMDEPARTEMENT" /> </property> <set name="Employe" inverse="true"> <key column="ID" not-null="true"/> <one-to-many class="com.my.dao.Employe" /> </set> </class> </hibernate-mapping>
调试后,问题出在这里:
boolean depbool = true; for(int j=0;j< departements.size();j++){ if(departements.get(j).getNomDepartement() == dep ) { depbool = false; } if(depbool){ try { dbD.create(departement); } catch (Throwable e) { e.printStackTrace(); } } }
恰好在这里:
dbD.create(departement);
这个DepartementImplDB类
package com.my.dao; import java.util.List; import org.hibernate.Session; import com.my.util.HibernateUtil; /** * @author Ilias * */ public class DepartementImplDB implements DepartementDao { /** * @see com.my.dao.DepartementDao#addDepartement(com.my.dao.Departement) */ @Override public int addDepartement(Departement D) { // TODO Auto-generated method stub Session session = HibernateUtil.getInstance().getSessionFactory().getCurrentSession(); session.beginTransaction();System.out.println("********"); session.save(D);System.out.println("departement implement metier"); session.getTransaction().commit(); D=this.getDepartementByNom(D.getNomDepartement()); return D.getId(); } /** * @see com.my.dao.DepartementDao#getDepartementById(int) */ @Override public Departement getDepartementById(int id) { // TODO Auto-generated method stub Session session = HibernateUtil.getInstance().getSessionFactory().getCurrentSession(); session.beginTransaction(); Departement dept = (Departement) session.load(Departement.class, id); return dept; } /** * @see com.my.dao.DepartementDao#getDepartementByNom(java.lang.String) */ @Override public Departement getDepartementByNom(String nomDepartement) { // TODO Auto-generated method stub Session session = HibernateUtil.getInstance().getSessionFactory().getCurrentSession(); session.beginTransaction(); Departement dept = (Departement) session.load(Departement.class, nomDepartement); return dept; } /** * @see com.my.dao.DepartementDao#deleteDepartement(int) */ @Override public void deleteDepartement(int id) { // TODO Auto-generated method stub Session session = HibernateUtil.getInstance().getSessionFactory().getCurrentSession(); session.beginTransaction(); Departement dept = (Departement) session.load(Departement.class, id); session.delete(dept); session.getTransaction().commit(); } /** * @see com.my.dao.DepartementDao#updateDepartement(com.my.dao.Departement) */ @Override public void updateDepartement(Departement D) { // TODO Auto-generated method stub } /** * @see com.my.dao.DepartementDao#getAllDepartement() */ @Override public List<Departement> getAllDepartement() { // TODO Auto-generated method stub Session session = HibernateUtil.getInstance().getSessionFactory().getCurrentSession(); session.beginTransaction(); return session.createQuery("from Departement").list(); } }
可以提供帮助吗?
你的错误是
org.hibernate.TypeMismatchException: Provided id of the wrong type. Expected: class java.lang.Integer, got class java.lang.String
在您的堆栈跟踪中,我们可以看到dbd.create调用了其他方法
at com.my.dao.DepartementImplDB.getDepartementByNom(DepartementImplDB.java:54) at com.my.dao.DepartementImplDB.addDepartement(DepartementImplDB.java:29)
用你的方法
public Departement getDepartementByNom(String nomDepartement)
您尝试加载具有名称的部门,但您使用由ID加载的session.load wich加载。
Departement dept = (Departement) session.load(Departement.class, nomDepartement);
您必须提出一个Criteria请求才能按名称加载。喜欢
session.beginTransaction(); Criteria criteria = session.createCriteria(Departement.class); criteria.add(Restrictions.eq("nomDepartement", nomDepartement).ignoreCase()); result = (Departement) criteria.uniqueResult(); session.getTransaction().commit();
ps:在getDepartementById和getDepartementByNom中,您永远不会结束交易。请使用以下模式:
try { session.beginTransaction(); // your code session.getTransaction().commit(); } catch (HibernateException e) { LOGGER.error(e); if (session.getTransaction().isActive()) { session.getTransaction().rollback(); } }