Return-Path: Delivered-To: apmail-ibatis-user-java-archive@www.apache.org Received: (qmail 11991 invoked from network); 13 Sep 2007 15:51:31 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.2) by minotaur.apache.org with SMTP; 13 Sep 2007 15:51:31 -0000 Received: (qmail 25477 invoked by uid 500); 13 Sep 2007 15:51:21 -0000 Delivered-To: apmail-ibatis-user-java-archive@ibatis.apache.org Received: (qmail 25465 invoked by uid 500); 13 Sep 2007 15:51:21 -0000 Mailing-List: contact user-java-help@ibatis.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: user-java@ibatis.apache.org Delivered-To: mailing list user-java@ibatis.apache.org Received: (qmail 25454 invoked by uid 99); 13 Sep 2007 15:51:21 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 13 Sep 2007 08:51:21 -0700 X-ASF-Spam-Status: No, hits=-0.0 required=10.0 tests=SPF_PASS X-Spam-Check-By: apache.org Received-SPF: pass (nike.apache.org: domain of kenny.pearce@hxti.com designates 216.203.4.133 as permitted sender) Received: from [216.203.4.133] (HELO mx0.hxti.com) (216.203.4.133) by apache.org (qpsmtpd/0.29) with ESMTP; Thu, 13 Sep 2007 15:52:56 +0000 Received: from mx0.hxti.com (localhost.localdomain [127.0.0.1]) by mx0.hxti.com (8.13.1/8.13.1) with ESMTP id l8DFopQj029602 for ; Thu, 13 Sep 2007 11:50:51 -0400 Received: from [10.50.10.213] (74-92-80-217-Philadelphia.hfc.comcastbusiness.net [74.92.80.217]) by mx0.hxti.com (Scalix SMTP Relay 11.0.2.17) via ESMTP; Thu, 13 Sep 2007 11:50:51 -0400 (EDT) Date: Thu, 13 Sep 2007 11:51:16 -0400 From: Kenny Pearce To: user-java@ibatis.apache.org Message-ID: <46E95C74.9030007@hxti.com> In-Reply-To: <50CA25BD6EEA954FA592C097399942E31937614A@CM1.wis.local> References: <50CA25BD6EEA954FA592C097399942E31937614A@CM1.wis.local> Subject: Re: abstract property x-scalix-Hops: 1 User-Agent: Thunderbird 2.0.0.6 (Windows/20070728) MIME-Version: 1.0 Content-Type: text/plain; charset="US-ASCII"; format="flowed" Content-Disposition: inline X-Spam-Checker-Version: SpamAssassin 3.1.9 (2007-02-13) on mx0.hxti.com X-Virus-Checked: Checked by ClamAV on apache.org X-Old-Spam-Status: No, score=-4.4 required=5.0 tests=ALL_TRUSTED,BAYES_00 autolearn=ham version=3.1.9 If I change the fooResultMap to: it gives an error because, of course, Bar has no property named subBarString. If I ignore the subBarString for the moment and delete that line I get a ProbeException with the text "Cannot set value of property 'myBar.barString' because 'myBar' is null and cannot be instantiated on instance of Bar", caused by an InstantiationException, which is to be expected since the specific subclass SubBar is no longer mentioned anywhere in the XML, and Bar is abstract. Niels Beekman wrote: > 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: > > > > Maybe one of the iBATIS developers could comment on this one... > > Niels > > -----Original Message----- > From: Kenny Pearce [mailto:kenny.pearce@hxti.com] > Sent: donderdag 13 september 2007 15:44 > To: user-java@ibatis.apache.org > 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 ================ > > PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN" > "http://www.ibatis.com/dtd/sql-map-config-2.dtd"> > > > > > > > /> > value="${JDBC.ConnectionURL}" /> > /> > /> > > > > > > > ================ Foo.xml ================ > > PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN" > "http://www.ibatis.com/dtd/sql-map-2.dtd"> > > > > > > > > > > > > > > > > ========================== 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:kenny.pearce@hxti.com] >> 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: >> >> >> >> >> >> >> >> >> >> >> >> >> >> 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 >> 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: >> >> >> >> >> >> But no go there either. >> >> Is there any way to do this, short of creating a custom object > factory? >> Thanks, >> > -- Kenny Pearce Hx Technologies