I'm missing the default constructors (public Foo() etc.) Marc Heimann Software Engineer
Prolifics Deutschland GmbH Notkestr. 3, D-22607 Hamburg phone +49 (0)40 890 667-70 fax +49 (0)40 890 667-99 [EMAIL PROTECTED] 2007 IBM Award Winner for Overall Technical Excellence SOA... Building Future Business Solutions Today Handelsregister: Hamburg, HRB 89903 Geschäftsführer: Ulrich Frotscher Kenny Pearce <[EMAIL PROTECTED]> wrote on 13.09.2007 15:43:49: > Alright, this is pretty long, but I've developed a basic case for the > problem I'm having, and all the files, output, etc. are copied below. > Maybe you can explain what I'm doing wrong. > > =============== table create statement ===================== > create table my_table (foo varchar(20), bar varchar(20), sub_bar > varchar(20)); > > =============== insert statement ==================== > insert into my_table values ('foo', 'bar', 'sub_bar'); > > =============== config.properties ================== > JDBC.Driver=com.mysql.jdbc.Driver > JDBC.ConnectionURL=jdbc:mysql://localhost:3306/ibatis_test > JDBC.Username=root > JDBC.Password=root > > =============== config.xml ================ > <?xml version="1.0" encoding="UTF-8" ?> > <!DOCTYPE sqlMapConfig > PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" > "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> > > <sqlMapConfig> > <properties resource="sqlmapconfig/config.properties"/> > > <transactionManager type="JDBC"> > <dataSource type="SIMPLE"> > <property name="JDBC.Driver" value="${JDBC.Driver}" > /> > <property name="JDBC.ConnectionURL" > value="${JDBC.ConnectionURL}" /> > <property name="JDBC.Username" value="${JDBC.Username}" > /> > <property name="JDBC.Password" value="${JDBC.Password}" > /> > </dataSource> > </transactionManager> > > <sqlMap resource="sqlmapconfig/Foo.xml"/> > </sqlMapConfig> > > ================ Foo.xml ================ > <?xml version="1.0" encoding="UTF-8" ?> > <!DOCTYPE sqlMap > PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" > "http://www.ibatis.com/dtd/sql-map-2.dtd"> > > > <sqlMap namespace="Foo"> > <resultMap class="Foo" id="fooResultMap"> > <result property="fooString" column="foo"/> > <result property="myBar" resultMap="Foo.barResultMap"/> > </resultMap> > <resultMap class="SubBar" id="barResultMap"> > <result property="barString" column="bar"/> > <result property="subBarString" column="sub_bar"/> > </resultMap> > > <select id="fooSelect" parameterClass="string" resultClass="Foo" > resultMap="fooResultMap"> > SELECT foo, bar, sub_bar from my_table WHERE foo = #value# > </select> > </sqlMap> > > ========================== Foo.java ======================== > public class Foo { > private String fooString; > private Bar myBar; > > public String getFooString() { > return fooString; > } > public void setFooString(String fooString) { > this.fooString = fooString; > } > public Bar getMyBar() { > return myBar; > } > public void setMyBar(Bar myBar) { > this.myBar = myBar; > } > } > > ===================== Bar.java ==================== > public abstract class Bar { > private String barString; > > public String getBarString() { > return barString; > } > > public void setBarString(String barString) { > this.barString = barString; > } > } > > =================== SubBar.java ======================= > public class SubBar extends Bar { > private String subBarString; > > public String getSubBarString() { > return subBarString; > } > > public void setSubBarString(String subBarString) { > this.subBarString = subBarString; > } > } > > ==================== SQLTest.java ================ > import java.io.InputStreamReader; > import java.io.Reader; > > import com.ibatis.sqlmap.client.SqlMapClient; > import com.ibatis.sqlmap.client.SqlMapClientBuilder; > > > public class SQLTest { > /** > * @param args > */ > public static void main(String[] args) { > SqlMapClient sql = null; > try > { > Reader reader = new > InputStreamReader(SQLTest.class.getResourceAsStream("/sqlmapconfig/ > config.xml")); > sql = SqlMapClientBuilder.buildSqlMapClient(reader); > } > catch (Throwable t) > { > t.printStackTrace(); > System.exit(1); > } > > Foo myFoo = null; > try{ > myFoo = (Foo)sql.queryForObject("fooSelect", "foo"); > }catch(Throwable t){ > t.printStackTrace(); > System.exit(2); > } > > System.out.println(myFoo.getFooString() + " - " + > myFoo.getMyBar().getBarString() > + " - " + ((SubBar)myFoo.getMyBar()).getSubBarString()); > } > } > > ============================================================= > > Executing SQLTest results in the following being printed to stderr: > > com.ibatis.common.jdbc.exception.NestedSQLException: > --- The error occurred in sqlmapconfig/Foo.xml. > --- The error occurred while applying a result map. > --- Check the Foo.fooResultMap. > --- The error happened while setting a property on the result object. > --- Cause: com.ibatis.sqlmap.client.SqlMapException: Error instantiating > collection property for mapping 'myBar'. Cause: > java.lang.InstantiationException > Caused by: java.lang.InstantiationException > Caused by: com.ibatis.sqlmap.client.SqlMapException: Error instantiating > collection property for mapping 'myBar'. Cause: > java.lang.InstantiationException > Caused by: java.lang.InstantiationException > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback > (GeneralStatement.java:188) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject > (GeneralStatement.java:104) > at > com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject > (SqlMapExecutorDelegate.java:561) > at > com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject > (SqlMapExecutorDelegate.java:536) > at > com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject > (SqlMapSessionImpl.java:93) > at > com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject > (SqlMapClientImpl.java:70) > at SQLTest.main(SQLTest.java:27) > Caused by: com.ibatis.sqlmap.client.SqlMapException: Error instantiating > collection property for mapping 'myBar'. Cause: > java.lang.InstantiationException > Caused by: java.lang.InstantiationException > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setNestedResultMappingValue > (BasicResultMap.java:397) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.applyNestedResultMap > (BasicResultMap.java:369) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setResultObjectValues > (BasicResultMap.java:355) > at > com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResultObject > (RowHandlerCallback.java:63) > at > com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults > (SqlExecutor.java:395) > at > com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery > (SqlExecutor.java:185) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteQuery > (GeneralStatement.java:205) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback > (GeneralStatement.java:173) > ... 6 more > Caused by: java.lang.InstantiationException > at > sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance > (InstantiationExceptionConstructorAccessorImpl.java:30) > at java.lang.reflect.Constructor.newInstance(Constructor.java:513) > at java.lang.Class.newInstance0(Class.java:355) > at java.lang.Class.newInstance(Class.java:308) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setNestedResultMappingValue > (BasicResultMap.java:395) > ... 13 more > > Caused by: > com.ibatis.sqlmap.client.SqlMapException: Error instantiating collection > property for mapping 'myBar'. Cause: java.lang.InstantiationException > Caused by: java.lang.InstantiationException > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setNestedResultMappingValue > (BasicResultMap.java:397) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.applyNestedResultMap > (BasicResultMap.java:369) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setResultObjectValues > (BasicResultMap.java:355) > at > com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResultObject > (RowHandlerCallback.java:63) > at > com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults > (SqlExecutor.java:395) > at > com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery > (SqlExecutor.java:185) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteQuery > (GeneralStatement.java:205) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback > (GeneralStatement.java:173) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject > (GeneralStatement.java:104) > at > com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject > (SqlMapExecutorDelegate.java:561) > at > com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject > (SqlMapExecutorDelegate.java:536) > at > com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject > (SqlMapSessionImpl.java:93) > at > com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject > (SqlMapClientImpl.java:70) > at SQLTest.main(SQLTest.java:27) > Caused by: java.lang.InstantiationException > at > sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance > (InstantiationExceptionConstructorAccessorImpl.java:30) > at java.lang.reflect.Constructor.newInstance(Constructor.java:513) > at java.lang.Class.newInstance0(Class.java:355) > at java.lang.Class.newInstance(Class.java:308) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setNestedResultMappingValue > (BasicResultMap.java:395) > ... 13 more > > Caused by: > java.lang.InstantiationException > at > sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance > (InstantiationExceptionConstructorAccessorImpl.java:30) > at java.lang.reflect.Constructor.newInstance(Constructor.java:513) > at java.lang.Class.newInstance0(Class.java:355) > at java.lang.Class.newInstance(Class.java:308) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setNestedResultMappingValue > (BasicResultMap.java:395) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.applyNestedResultMap > (BasicResultMap.java:369) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setResultObjectValues > (BasicResultMap.java:355) > at > com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResultObject > (RowHandlerCallback.java:63) > at > com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults > (SqlExecutor.java:395) > at > com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery > (SqlExecutor.java:185) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteQuery > (GeneralStatement.java:205) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback > (GeneralStatement.java:173) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject > (GeneralStatement.java:104) > at > com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject > (SqlMapExecutorDelegate.java:561) > at > com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject > (SqlMapExecutorDelegate.java:536) > at > com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject > (SqlMapSessionImpl.java:93) > at > com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject > (SqlMapClientImpl.java:70) > at SQLTest.main(SQLTest.java:27) > > Caused by: > com.ibatis.sqlmap.client.SqlMapException: Error instantiating collection > property for mapping 'myBar'. Cause: java.lang.InstantiationException > Caused by: java.lang.InstantiationException > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setNestedResultMappingValue > (BasicResultMap.java:397) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.applyNestedResultMap > (BasicResultMap.java:369) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setResultObjectValues > (BasicResultMap.java:355) > at > com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResultObject > (RowHandlerCallback.java:63) > at > com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults > (SqlExecutor.java:395) > at > com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery > (SqlExecutor.java:185) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteQuery > (GeneralStatement.java:205) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback > (GeneralStatement.java:173) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject > (GeneralStatement.java:104) > at > com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject > (SqlMapExecutorDelegate.java:561) > at > com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject > (SqlMapExecutorDelegate.java:536) > at > com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject > (SqlMapSessionImpl.java:93) > at > com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject > (SqlMapClientImpl.java:70) > at SQLTest.main(SQLTest.java:27) > Caused by: java.lang.InstantiationException > at > sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance > (InstantiationExceptionConstructorAccessorImpl.java:30) > at java.lang.reflect.Constructor.newInstance(Constructor.java:513) > at java.lang.Class.newInstance0(Class.java:355) > at java.lang.Class.newInstance(Class.java:308) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setNestedResultMappingValue > (BasicResultMap.java:395) > ... 13 more > > Caused by: > java.lang.InstantiationException > at > sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance > (InstantiationExceptionConstructorAccessorImpl.java:30) > at java.lang.reflect.Constructor.newInstance(Constructor.java:513) > at java.lang.Class.newInstance0(Class.java:355) > at java.lang.Class.newInstance(Class.java:308) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setNestedResultMappingValue > (BasicResultMap.java:395) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.applyNestedResultMap > (BasicResultMap.java:369) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setResultObjectValues > (BasicResultMap.java:355) > at > com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResultObject > (RowHandlerCallback.java:63) > at > com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults > (SqlExecutor.java:395) > at > com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery > (SqlExecutor.java:185) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteQuery > (GeneralStatement.java:205) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback > (GeneralStatement.java:173) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject > (GeneralStatement.java:104) > at > com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject > (SqlMapExecutorDelegate.java:561) > at > com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject > (SqlMapExecutorDelegate.java:536) > at > com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject > (SqlMapSessionImpl.java:93) > at > com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject > (SqlMapClientImpl.java:70) > at SQLTest.main(SQLTest.java:27) > > Caused by: > java.lang.InstantiationException > at > sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance > (InstantiationExceptionConstructorAccessorImpl.java:30) > at java.lang.reflect.Constructor.newInstance(Constructor.java:513) > at java.lang.Class.newInstance0(Class.java:355) > at java.lang.Class.newInstance(Class.java:308) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setNestedResultMappingValue > (BasicResultMap.java:395) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.applyNestedResultMap > (BasicResultMap.java:369) > at > com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setResultObjectValues > (BasicResultMap.java:355) > at > com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResultObject > (RowHandlerCallback.java:63) > at > com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults > (SqlExecutor.java:395) > at > com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery > (SqlExecutor.java:185) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.sqlExecuteQuery > (GeneralStatement.java:205) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback > (GeneralStatement.java:173) > at > com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryForObject > (GeneralStatement.java:104) > at > com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject > (SqlMapExecutorDelegate.java:561) > at > com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject > (SqlMapExecutorDelegate.java:536) > at > com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject > (SqlMapSessionImpl.java:93) > at > com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject > (SqlMapClientImpl.java:70) > at SQLTest.main(SQLTest.java:27) > > > Niels Beekman wrote: > > How could iBATIS throw an InstantiationException when you're not even > > telling it the name of your abstract class? Please post the full > > exception stacktrace and your result maps. > > > > Niels > > > > -----Original Message----- > > From: Kenny Pearce [mailto:[EMAIL PROTECTED] > > Sent: woensdag 12 september 2007 20:46 > > To: user-java@ibatis.apache.org > > Subject: abstract property > > > > Hello, > > I am trying to use iBatis in a case where I have an object > > hierarchy > > like the following: > > > > class Foo{ > > String fooString; > > Bar myBar; > > //getters and setters omitted > > } > > > > abstract class Bar{ > > String barString; > > //getters and setters omitted > > } > > > > class SubBar extends Bar{ > > String subBarString; > > //getters and setters omitted > > } > > > > I would like to be able to do this: > > > > <resultMap id="fooResultMap" class="Foo"> > > <result property="fooString" column="foo"/> > > <result property="myBar" resultMap="barResultMap"/> > > </resultMap> > > > > <resultMap id="barResultMap" class="SubBar"> > > <result property="barString" column="bar"/> > > <result proprty="subBarString" column="sub_bar"/> > > </resultMap> > > > > <select id="fooSelect" parameterClass="string" resultClass="Foo" > > resultMap="fooResultMap"> > > SELECT foo, bar, sub_bar FROM table WHERE foo = #value# > > </select> > > > > But that gives an InstantiationException (despite the fact that the > > barResultMap has the class SubBar, which is concrete, specified). Next I > > > > tried using a discriminator and making a separate barResultMap and > > subBarResultMap (where subBarResultMap extends barResultMap) with > > <subMap value="*" ...> on a column that is never null (I'm not sure if > > wildcard is supported - I couldn't find discriminator in the docs, but > > it's not listed on the undocumented features page). That still threw an > > exception. Next, I changed the select statement to (the equivalent of): > > > > SELECT foo, bar, sub_bar, 1 as use_submap FROM table WHERE foo = > > #value# > > > > and used: > > > > <discriminator column="use_submap" javaType="int"> > > <subMap value="1" resultMap="subBarResultMap"/> > > </discriminator> > > > > But no go there either. > > > > Is there any way to do this, short of creating a custom object factory? > > > > Thanks, > > > > -- > Kenny Pearce > Hx Technologies
<<image/gif>>