facebook

org.hibernate.TypeMismatchException: id of the wrong type

  1. MyEclipse IDE
  2.  > 
  3. Spring Development
Viewing 2 posts - 1 through 2 (of 2 total)
  • Author
    Posts
  • #320830 Reply

    I’m working for the first time with MyEclipse For Spring, which has hibernate support.
    I scaffolded a crud application from a mysql db given by the client.

    Following the relevant part of the mysql db:

    
    CREATE TABLE 
    `delidete`.`DatiGeneraliVistoContabile` (
        `DatiGeneraliId` int NOT NULL,       <---- P.K., Foreign key to table Datigenerali
        `SoggettiCodice` int NOT NULL,       <---- P.K., Foreign key to table Soggetti
        `DGVCDataInizio` date NOT NULL, 
        `DGVCDataFine` date) ;
    
    CREATE TABLE 
    `delidete`.`DatiGeneraliParereTecnico` (
        `DatiGeneraliId` int NOT NULL,       <---- P.K., Foreign key to above table (DatigeneraliId)
        `TecnicoParereCodice` int NOT NULL,  <---- P.K., Foreign key to above table (SoggettiCodice)
        `DGTPDescrizione` varchar (255) NOT NULL,
        `DGTPDataInizio` date NOT NULL, 
        `DGTPDataFine` date) ;
    
    ALTER TABLE `delidete`.`DatiGeneraliVistoContabile` 
    ADD PRIMARY KEY (`DatiGeneraliId`, `SoggettiCodice`) ;
    
    ALTER TABLE `delidete`.`DatiGeneraliParereTecnico` 
    ADD CONSTRAINT `IDatiGeneraliParereTecnico` 
        FOREIGN KEY (`DatiGeneraliId`, `TecnicoParereCodice`) 
            REFERENCES `DatiGeneraliVistoContabile` (`DatiGeneraliId`, `SoggettiCodice`) ;
    
    ALTER TABLE `delidete`.`DatiGeneraliVistoContabile` 
    ADD CONSTRAINT `IDatiGeneraliVistoContabile2` 
        FOREIGN KEY (`DatiGeneraliId`) 
            REFERENCES `DatiGenerali` (`DatiGeneraliId`) ;
    
    ALTER TABLE `delidete`.`DatiGeneraliVistoContabile` 
    ADD CONSTRAINT `IDatiGeneraliVistoContabile1` 
        FOREIGN KEY (`SoggettiCodice`) 
            REFERENCES `Soggetti` (`SoggettiCodice`) ;
    

    These are the two generated classes:

    
    Datigeneralivistocontabile:
    
    @IdClass(delidete.domain.DatigeneralivistocontabilePK.class)
    @Entity
    @Table(catalog = "delidete", name = "datigeneralivistocontabile")
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(namespace = "DeliDete/delidete/domain", name = "Datigeneralivistocontabile")
    public class Datigeneralivistocontabile implements Serializable
    {
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumns({@JoinColumn(name = "DatiGeneraliId", referencedColumnName = "DatiGeneraliId", nullable = false, insertable = false, updatable = false)})
        @XmlTransient
        Datigenerali datigenerali;
    
        @Column(name = "DatiGeneraliId", nullable = false)
        @Basic(fetch = FetchType.EAGER)
        @Id
        @XmlElement
        Integer datiGeneraliId;
    
        ----------------------------------------------------------------------
        //don't know why MyEclipse put this link into this class
        @OneToOne(mappedBy = "datigeneralivistocontabile", fetch = FetchType.LAZY)
        @XmlElement(name = "", namespace = "")
        Datigeneralipareretecnico datigeneralipareretecnico;
        ----------------------------------------------------------------------
    
        @Temporal(TemporalType.DATE)
        @Column(name = "DGVCDataFine")
        @Basic(fetch = FetchType.EAGER)
        @XmlElement
        Calendar dgvcdataFine;
    
        @Temporal(TemporalType.DATE)
        @Column(name = "DGVCDataInizio", nullable = false)
        @Basic(fetch = FetchType.EAGER)
        @XmlElement
        Calendar dgvcdataInizio;
    
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumns({@JoinColumn(name = "SoggettiCodice", referencedColumnName = "SoggettiCodice", nullable = false, insertable = false, updatable = false)})
        @XmlTransient
        Soggetti soggetti;
    
        @Column(name = "SoggettiCodice", nullable = false)
        @Basic(fetch = FetchType.EAGER)
        @Id
        @XmlElement
        Integer soggettiCodice;
    
        constructors, getters, setters, toString, other stuff
    }
    

    The other class

    
    Datigeneralipareretecnico:
    
    @IdClass(delidete.domain.DatigeneralipareretecnicoPK.class)
    @Entity
    @Table(catalog = "delidete", name = "datigeneralipareretecnico")
    @XmlAccessorType(XmlAccessType.FIELD)
    @XmlType(namespace = "DeliDete/delidete/domain", name = "Datigeneralipareretecnico")
    public class Datigeneralipareretecnico implements Serializable
    {
        @ManyToOne(fetch = FetchType.LAZY)
        @JoinColumns({@JoinColumn(name = "IDEnte", referencedColumnName = "DatiGeneraliId", nullable = false)})
        @XmlTransient
        Datigenerali datigenerali;
    
        @Column(name = "DatiGeneraliId", nullable = false)
        @Basic(fetch = FetchType.EAGER)
        @Id
        @XmlElement
        Integer datiGeneraliId;
    
        @PrimaryKeyJoinColumn
        @OneToOne(fetch = FetchType.LAZY)
        @XmlElement(name = "", namespace = "")
        Datigeneralivistocontabile datigeneralivistocontabile;
    
        @Temporal(TemporalType.DATE)
        @Column(name = "DGTPDataFine")
        @Basic(fetch = FetchType.EAGER)
        @XmlElement
        Calendar dgtpdataFine;
    
        @Temporal(TemporalType.DATE)
        @Column(name = "DGTPDataInizio", nullable = false)
        @Basic(fetch = FetchType.EAGER)
        @XmlElement
        Calendar dgtpdataInizio;
    
        @Column(name = "DGTPDescrizione", nullable = false)
        @Basic(fetch = FetchType.EAGER)
        @XmlElement
        String dgtpdescrizione;
    
        @Column(name = "TecnicoParereCodice", nullable = false)
        @Basic(fetch = FetchType.EAGER)
        @Id
        @XmlElement
        Integer tecnicoParereCodice;
    
        constructors, getters, setters, toString, other stuff
    }
    

    And the two PK classes:

    
    public class DatigeneralivistocontabilePK implements Serializable
    {
        @Column(name = "DatiGeneraliId", nullable = false)
        @Basic(fetch = FetchType.EAGER)
        @Id
        public Integer datiGeneraliId;
    
        @Column(name = "SoggettiCodice", nullable = false)
        @Basic(fetch = FetchType.EAGER)
        @Id
        public Integer soggettiCodice;
    }
    
    public class DatigeneralipareretecnicoPK implements Serializable
    {
        @Column(name = "DatiGeneraliId", nullable = false)
        @Basic(fetch = FetchType.EAGER)
        @Id
        public Integer datiGeneraliId;
    
        @Column(name = "TecnicoParereCodice", nullable = false)
        @Basic(fetch = FetchType.EAGER)
        @Id
        public Integer tecnicoParereCodice;
    }
    

    Now when I try to save a Datigeneralivistocontabile entity it all goes ok, but when I try to open a jsp to show that entity I get:

    
    GRAVE: Servlet.service() for servlet [DeliDete Servlet] in context with path  [/DeliDete] threw exception [Request processing failed; nested exception is java.lang.IllegalArgumentException: org.hibernate.TypeMismatchException: Provided id of the   wrong type for class delidete.domain.Datigeneralipareretecnico. Expected: class   delidete.domain.DatigeneralipareretecnicoPK, got class   delidete.domain.DatigeneralivistocontabilePK] with root cause
     org.hibernate.TypeMismatchException: Provided id of the wrong type for class delidete.domain.Datigeneralipareretecnico. Expected: class delidete.domain.DatigeneralipareretecnicoPK, got class delidete.domain.DatigeneralivistocontabilePK
    at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:135)
    at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:1080)
    at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:1028)
    at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:623)
    at org.hibernate.type.EntityType.resolve(EntityType.java:431)
    at org.hibernate.engine.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:140)
    at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:898)
    at org.hibernate.loader.Loader.doQuery(Loader.java:773)
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:270)
    at org.hibernate.loader.Loader.doList(Loader.java:2449)
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2192)
    at org.hibernate.loader.Loader.list(Loader.java:2187)
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:452)
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:363)
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:196)
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1258)
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:102)
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:241)
    -----------------------------------------------------------------------
    at delidete.dao.DatigeneralivistocontabileDAOImpl.findAllDatigeneralivistocontabiles(DatigeneralivistocontabileDAOImpl.java:109)
    at delidete.dao.DatigeneralivistocontabileDAOImpl.findAllDatigeneralivistocontabiles(DatigeneralivistocontabileDAOImpl.java:93)
    -----------------------------------------------------------------------
    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.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy61.findAllDatigeneralivistocontabiles(Unknown Source)
    ----------------------------------------------------------------------- 
    at delidete.service.DatigeneralivistocontabileServiceImpl.loadDatigeneralivistocontabiles(DatigeneralivistocontabileServiceImpl.java:226)
    -----------------------------------------------------------------------
    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.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
    at $Proxy88.loadDatigeneralivistocontabiles(Unknown Source)
    -----------------------------------------------------------------------
    at delidete.web.DatigeneralivistocontabileController.listDatigeneralivistocontabile(DatigeneralivistocontabileController.java:466)
    -----------------------------------------------------------------------
    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.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:176)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:426)
    at org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:414)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:790)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:304)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at com.opensymphony.sitemesh.webapp.SiteMeshFilter.obtainContent(SiteMeshFilter.java:129)
    at com.opensymphony.sitemesh.webapp.SiteMeshFilter.doFilter(SiteMeshFilter.java:77)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter.doFilterInternal(OpenEntityManagerInViewFilter.java:113)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:185)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:151)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:405)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:269)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:515)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:302)
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
    at java.lang.Thread.run(Thread.java:619)
    

    My classes are located in the package “delidete”. The method throwing this exception is:

    
    @Transactional
    public Set<Datigeneralivistocontabile> findAllDatigeneralivistocontabiles(
            int startResult, int maxRows) throws DataAccessException
    {
        Query query = createNamedQuery("findAllDatigeneralivistocontabiles",
                startResult, maxRows);
        return new LinkedHashSet<Datigeneralivistocontabile>(
                query.getResultList());   <---- this line throws the exception
    }
    

    and the namedquery it’s calling is:

    
    @NamedQuery(name = "findAllDatigeneralivistocontabiles", query = "select myDatigeneralivistocontabile from Datigeneralivistocontabile myDatigeneralivistocontabile")
    

    The query “select * from datigeneralivistocontabile;” in the MySQL prompt is fine:

    
    mysql> select * from datigeneralivistocontabile;
    +----------------+----------------+----------------+--------------+
    | DatiGeneraliId | SoggettiCodice | DGVCDataInizio | DGVCDataFine |
    +----------------+----------------+----------------+--------------+
    |              1 |              1 | 2011-11-02     | 2011-11-03   |
    +----------------+----------------+----------------+--------------+
    1 row in set (0.00 sec)
    
    mysql>
    

    I don’t know what to do, because I managed tens of entities like these two without this problem. The thing I’m noticing is that this is the first time I get a @OneToOne annotation. Maybe it’s this that’s causing the exception…

    Thanks in advance to you all

    #320833 Reply

    For the ones having the same problem, I solved doing the following:

    – re-engineered the database changing the column names so that they match in name and type
    – scaffolded all the layers (dao, domain, service, web controller) and the jsps from the new database
    – changed the annotation IdClass of the class Datigeneralipareretecnico as following:
    @IdClass(delidete.domain.DatigeneralipareretecnicoPK.class) —> @IdClass(delidete.domain.DatigeneralivistocontabilePK.class)
    because now they have the same columns for both primary and foreign keys.

    Hope to help!

Viewing 2 posts - 1 through 2 (of 2 total)
Reply To: org.hibernate.TypeMismatchException: id of the wrong type

You must be logged in to post in the forum log in