- This topic has 1 reply, 1 voice, and was last updated 13 years, 4 months ago by
ironmaiden189.
-
AuthorPosts
-
ironmaiden189MemberI’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
ironmaiden189MemberFor 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!
-
AuthorPosts