So we're hitting an issue currently using a many to many table with no primary key, only a composite key. In essence what's happening is that we have two tables, BUILD_RESULT and INSTALL_BUILD_RESULT that contain data. The primary key for BUILD_RESULT is a native SQL key, but also has a unique
varchar column which we want to map in our many-to-many table along with INSTALL_BUILD_RESULT's natively assigned primary key. The many-to-many table is LINK_BUILD_TO_INSTALL_BUILD. Below is the applicable portions of the mapping files
Build_Result --
<hibernate-mapping>
<class name="com.crd.hibernatespring.BuildResult" table="BUILD_RESULT" schema="dbo" catalog="MSSRELENG_NEWER">
<id name="buildResultId" type="java.lang.Integer">
<column name="Build_Result_Id" />
<generator class="native" />
</id>
....
<set name="installBuildResults" table="LINK_BUILD_TO_INSTALL_BUILD" cascade="all">
<key column="Build_Id" />
<many-to-many column="Install_Build_Id" property-ref="installBuildId" class="com.crd.hibernatespring.InstallBuildResult" />
</set>
</class>
</hibernate-mapping>
Install_Build_Result --
<hibernate-mapping>
<class name="com.crd.hibernatespring.InstallBuildResult" table="INSTALL_BUILD_RESULT" schema="dbo" catalog="MSSRELENG_NEWER">
<id name="installBuildResultId" type="java.lang.Integer">
<column name="Install_Build_Result_Id" />
<generator class="native" />
</id>
....
<set name="buildResults" table="LINK_BUILD_TO_INSTALL_BUILD" cascade="all">
<key column="Install_Build_Id" />
<many-to-many column="Build_Id" property-ref="buildId" class="com.crd.hibernatespring.BuildResult" />
</set>
</class>
</hibernate-mapping>
Link_Build_To_Install_Build --
<hibernate-mapping>
<class name="com.crd.hibernatespring.LinkBuildToInstallBuild" table="LINK_BUILD_TO_INSTALL_BUILD" schema="dbo" catalog="MSSRELENG_NEWER">
<composite-id name="id" class="com.crd.hibernatespring.LinkBuildToInstallBuildId">
<key-property name="buildId">
<column name="Build_Id" />
</key-property>
<key-property name="installBuildId">
<column name="Install_Build_Id" />
</key-property>
</composite-id>
<many-to-one name="buildResult" class="com.crd.hibernatespring.BuildResult" property-ref="buildId" update="false" insert="false" fetch="select">
<column name="Build_Id" not-null="true" />
</many-to-one>
<many-to-one name="installBuildResult" class="com.crd.hibernatespring.InstallBuildResult" property-ref="installBuildId" update="false" insert="false" fetch="select">
<column name="Install_Build_Id" not-null="true" />
</many-to-one>
</class>
</hibernate-mapping>
Now, I'm trying to run this method on a transient lazily-loaded BuildResult object from an older session.
Code:
public BuildResult fullyLoadBuildResult(BuildResult transientInstance){
final BuildResult nBr = transientInstance;
BuildResult res = (BuildResult)hibernateTemplate.execute(new HibernateCallback(){
public Object doInHibernate(Session session){
session.refresh(nBr);
Hibernate.initialize(nBr.getArchiveStatus());
Hibernate.initialize(nBr.getBatParadigmPromotionResults());
Hibernate.initialize(nBr.getBuildId());
Hibernate.initialize(nBr.getBuildProject());
Hibernate.initialize(nBr.getBuildResultId());
Hibernate.initialize(nBr.getChangeReportEndTime());
Hibernate.initialize(nBr.getChangeReportStartTime());
Hibernate.initialize(nBr.getChangeReportUri());
Hibernate.initialize(nBr.getDuration());
Hibernate.initialize(nBr.getEndTime());
//Hibernate.initialize(nBr.getInstallBuildResults());
Hibernate.initialize(nBr.getIsForced());
Hibernate.initialize(nBr.getIsPromoted());
Hibernate.initialize(nBr.getLastModified());
Hibernate.initialize(nBr.getLinesOfCode());
Hibernate.initialize(nBr.getMachine());
Hibernate.initialize(nBr.getOperationalStatus());
Hibernate.initialize(nBr.getPostingDirectory());
Hibernate.initialize(nBr.getProductRelease());
Hibernate.initialize(nBr.getRunningQue());
Hibernate.initialize(nBr.getRunResultsLink());
Hibernate.initialize(nBr.getStartTime());
Hibernate.initialize(nBr.getWarningsList());
return nBr;
}
});
return res;
}
However, I'm receiving an exception --
Code:
java.sql.SQLException: Conversion failed when converting the varchar value 'D20071116133350' to data type int.
at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368)
at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2816)
at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2254)
at net.sourceforge.jtds.jdbc.TdsCore.isDataInResultSet(TdsCore.java:795)
at net.sourceforge.jtds.jdbc.JtdsResultSet.<init>(JtdsResultSet.java:146)
at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:483)
at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:777)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1860)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3044)
at org.hibernate.event.def.DefaultRefreshEventListener.onRefresh(DefaultRefreshEventListener.java:123)
at org.hibernate.event.def.DefaultRefreshEventListener.onRefresh(DefaultRefreshEventListener.java:39)
at org.hibernate.impl.SessionImpl.fireRefresh(SessionImpl.java:902)
at org.hibernate.impl.SessionImpl.refresh(SessionImpl.java:886)
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.orm.hibernate3.HibernateTemplate$CloseSuppressingInvocationHandler.invoke(HibernateTemplate.java:1289)
at $Proxy6.refresh(Unknown Source)
at com.crd.hibernatespring.BuildResultDAO$1.doInHibernate(BuildResultDAO.java:68)
at org.springframework.orm.hibernate3.HibernateTemplate.doExecute(HibernateTemplate.java:419)
........
where D2007111... is the BuildId (varchar) that it's trying to convert to an int since it's mapped as a key for the link table. Any idea what changes can be made to the mapping files so Hibernate doesn't assume that BuildId is an integer?
Any help is much appreciated
Vijal