If you study the exception in detail: Error instantiating collection
property for mapping 'myBar', you can see that iBATIS tries to
instantiate a collection. This is because you are using the resultMap
attribute to instantiate a non-collection property. I guess this is
unsupported, but I'm not sure about it. You could use the following
nested properties syntax:

<result property="myBar.barString" column="bar"/>

Maybe one of the iBATIS developers could comment on this one...

Niels

-----Original Message-----
From: Kenny Pearce [mailto:[EMAIL PROTECTED] 
Sent: donderdag 13 september 2007 15:44
To: [email protected]
Subject: Re: abstract property

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/confi
g.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.executeQuery
WithCallback(GeneralStatement.java:188)
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
ForObject(GeneralStatement.java:104)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlM
apExecutorDelegate.java:561)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlM
apExecutorDelegate.java:536)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSes
sionImpl.java:93)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClie
ntImpl.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.setNestedResultMa
ppingValue(BasicResultMap.java:397)
        at 
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.applyNestedResult
Map(BasicResultMap.java:369)
        at 
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setResultObjectVa
lues(BasicResultMap.java:355)
        at 
com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResu
ltObject(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.sqlExecuteQu
ery(GeneralStatement.java:205)
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
WithCallback(GeneralStatement.java:173)
        ... 6 more
Caused by: java.lang.InstantiationException
        at 
sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(In
stantiationExceptionConstructorAccessorImpl.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.setNestedResultMa
ppingValue(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.setNestedResultMa
ppingValue(BasicResultMap.java:397)
        at 
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.applyNestedResult
Map(BasicResultMap.java:369)
        at 
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setResultObjectVa
lues(BasicResultMap.java:355)
        at 
com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResu
ltObject(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.sqlExecuteQu
ery(GeneralStatement.java:205)
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
WithCallback(GeneralStatement.java:173)
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
ForObject(GeneralStatement.java:104)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlM
apExecutorDelegate.java:561)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlM
apExecutorDelegate.java:536)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSes
sionImpl.java:93)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClie
ntImpl.java:70)
        at SQLTest.main(SQLTest.java:27)
Caused by: java.lang.InstantiationException
        at 
sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(In
stantiationExceptionConstructorAccessorImpl.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.setNestedResultMa
ppingValue(BasicResultMap.java:395)
        ... 13 more

Caused by:
java.lang.InstantiationException
        at 
sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(In
stantiationExceptionConstructorAccessorImpl.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.setNestedResultMa
ppingValue(BasicResultMap.java:395)
        at 
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.applyNestedResult
Map(BasicResultMap.java:369)
        at 
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setResultObjectVa
lues(BasicResultMap.java:355)
        at 
com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResu
ltObject(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.sqlExecuteQu
ery(GeneralStatement.java:205)
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
WithCallback(GeneralStatement.java:173)
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
ForObject(GeneralStatement.java:104)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlM
apExecutorDelegate.java:561)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlM
apExecutorDelegate.java:536)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSes
sionImpl.java:93)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClie
ntImpl.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.setNestedResultMa
ppingValue(BasicResultMap.java:397)
        at 
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.applyNestedResult
Map(BasicResultMap.java:369)
        at 
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setResultObjectVa
lues(BasicResultMap.java:355)
        at 
com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResu
ltObject(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.sqlExecuteQu
ery(GeneralStatement.java:205)
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
WithCallback(GeneralStatement.java:173)
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
ForObject(GeneralStatement.java:104)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlM
apExecutorDelegate.java:561)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlM
apExecutorDelegate.java:536)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSes
sionImpl.java:93)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClie
ntImpl.java:70)
        at SQLTest.main(SQLTest.java:27)
Caused by: java.lang.InstantiationException
        at 
sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(In
stantiationExceptionConstructorAccessorImpl.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.setNestedResultMa
ppingValue(BasicResultMap.java:395)
        ... 13 more

Caused by:
java.lang.InstantiationException
        at 
sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(In
stantiationExceptionConstructorAccessorImpl.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.setNestedResultMa
ppingValue(BasicResultMap.java:395)
        at 
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.applyNestedResult
Map(BasicResultMap.java:369)
        at 
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setResultObjectVa
lues(BasicResultMap.java:355)
        at 
com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResu
ltObject(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.sqlExecuteQu
ery(GeneralStatement.java:205)
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
WithCallback(GeneralStatement.java:173)
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
ForObject(GeneralStatement.java:104)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlM
apExecutorDelegate.java:561)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlM
apExecutorDelegate.java:536)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSes
sionImpl.java:93)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClie
ntImpl.java:70)
        at SQLTest.main(SQLTest.java:27)

Caused by:
java.lang.InstantiationException
        at 
sun.reflect.InstantiationExceptionConstructorAccessorImpl.newInstance(In
stantiationExceptionConstructorAccessorImpl.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.setNestedResultMa
ppingValue(BasicResultMap.java:395)
        at 
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.applyNestedResult
Map(BasicResultMap.java:369)
        at 
com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setResultObjectVa
lues(BasicResultMap.java:355)
        at 
com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResu
ltObject(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.sqlExecuteQu
ery(GeneralStatement.java:205)
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
WithCallback(GeneralStatement.java:173)
        at 
com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQuery
ForObject(GeneralStatement.java:104)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlM
apExecutorDelegate.java:561)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.queryForObject(SqlM
apExecutorDelegate.java:536)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.queryForObject(SqlMapSes
sionImpl.java:93)
        at 
com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.queryForObject(SqlMapClie
ntImpl.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: [email protected]
> 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

Reply via email to