2011-11-03 84 views
0

我正在第一次使用MyEclipse For Spring,它支持hibernate。org.hibernate.TypeMismatchException:提供了錯誤類型的ID

繼MySQL數據庫的相關部分:

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`) ; 

這是兩個生成的類:

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 
} 

其他類

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 
} 

而且,這兩個PK類:

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

現在,當我嘗試保存Datigeneralivistocontabile實體這一切都OK,但是當我嘗試打開一個jsp表明實體獲取:

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) 

我的課都位於包「delidete」 。 拋出此異常的方法是:

@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 
} 

和它調用了namedquery是:

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

查詢 「從datigeneralivistocontabile選擇*;」在MySQL提示的罰款:

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

mysql> 

我不知道該怎麼辦,因爲我設法幾十喜歡這兩個實體的沒有問題。我注意到的是這是我第一次得到@OneToOne註釋。 也許這是這是造成異常...

在此先感謝大家

編輯:試圖改變列名TecnicoParereCodice到SoggettiCodice也列在第一個表匹配的名字,但沒有發生任何變化:我重新搭建的一切,運行相同的測試,並得到了同樣的錯誤

回答

2

由於主鍵是一樣的,但不同的屬性名稱,我修改這樣的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) 
`SoggettiCodice` int NOT NULL,  <---- P.K., Foreign key to above table (SoggettiCodice) 
`DGTPDescrizione` varchar (255) NOT NULL, 
`DGTPDataInizio` date NOT NULL, 
`DGTPDataFine` date) ; 

重新搭建的兩個實體,改變了類Datigeneralipareretecnico如下:

**@IdClass(delidete.domain.DatigeneralivistocontabilePK.class)** 
@Entity 
@Table(catalog = "delidete", name = "datigeneralipareretecnico") 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(namespace = "DeliDete/delidete/domain", name = "Datigeneralipareretecnico") 
public class Datigeneralipareretecnico implements Serializable 
{ 
    .... 
} 

正如你可以在課堂上看到Datigeneralipareretecnico我用PK類爲類Datigeneralivistocontabile,一切都OK。 我知道這不是解決問題的正確方法,但嘿它有效! 希望能幫到別人..

相關問題