Receiving the org.hibernate.TypeMismatchException Exception [closed]

坚强是说给别人听的谎言 提交于 2019-12-03 01:21:52

问题


I'm working on an application with Spring using SpringMVC, i'm encountering the following error and i don't know how to deal with it .

now i have this message in Console :

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)

this is my ImportController class

/**
 * @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";
}}
}

this is my 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>

this is my 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>

after debuging, the problem is here :

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();
            }
        }
        }

exactely here :

dbD.create(departement);

this DepartementImplDB class

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();          
    }
}

this is the link of my last error for more infos : Link
can some one help ?


回答1:


Your error is

org.hibernate.TypeMismatchException: Provided id of the wrong type. Expected: class java.lang.Integer, got class java.lang.String

In your stacktrace we can see that dbd.create call others methods

    at com.my.dao.DepartementImplDB.getDepartementByNom(DepartementImplDB.java:54)
at com.my.dao.DepartementImplDB.addDepartement(DepartementImplDB.java:29)

In your method

public Departement getDepartementByNom(String nomDepartement)

You try to load a departement with a name but you use session.load wich load by Id.

 Departement dept = (Departement) session.load(Departement.class, nomDepartement);

You have to make a Criteria request to load by name. Like

session.beginTransaction();
Criteria criteria = session.createCriteria(Departement.class);
criteria.add(Restrictions.eq("nomDepartement", nomDepartement).ignoreCase());

 result = (Departement) criteria.uniqueResult();
 session.getTransaction().commit();

ps: In getDepartementById and getDepartementByNom you never end your transaction. Please use pattern like:

 try {
        session.beginTransaction();

        // your code

        session.getTransaction().commit();
    } catch (HibernateException e) {
        LOGGER.error(e);
        if (session.getTransaction().isActive()) {
            session.getTransaction().rollback();
        }
    }



回答2:


Exception:-
Provided id of the wrong type. Expected: class java.lang.Integer, got class java.lang.String

Its very clear by seeing the above line, hibernate is expecting the id as an integer but receiving id in the String format. So it's throwing :-
org.hibernate.TypeMismatchException



来源:https://stackoverflow.com/questions/31872161/receiving-the-org-hibernate-typemismatchexception-exception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!