I am only experiencing this issue with many-sided collections. I started looking through FieldMolder last night and discovered that it is doing some "strict" reflection in most cases (i.e., attempting to map collection="arraylist" to java.util.List in the class will not work in those scenarios). It has to do with the way FieldMolder's findAccessor() method is performing reflection.
It uses the Class.getMethod signature taking the parameter types as an arg. The problem is that this getMethod signature only accounts for exactly the same types (if you pass ArrayList, it will not match List). The "better" way is to use Class.getMethods() and then loop through the Method.getParameterTypes() looking for a parameter type match using either "instanceof" or "Class.isAssignableFrom()". Of course this method is not as fast. For my purposes here, the current functionality is just not acceptable. I will be modifying FieldMolder such that findAccessor still does its current checking but if unable to resolve that accessor would do the above mentioned checks. Would anyone have objections and/or needs for this functionality? Basically, is this something which should be commited back to CVS or should I just maintain a locally modified copy here? ******************************************** Steve Ebersole IT Integration Engineer Vignette Corporation 512.741.4195 Visit http://www.vignette.com ******************************************** -----Original Message----- From: Patrick van Kann [mailto:[EMAIL PROTECTED]] Sent: Tuesday, March 05, 2002 3:01 AM To: [EMAIL PROTECTED] Subject: Re: [castor-dev] Date: Fri, 1 Mar 2002 18:54:41 -0600 I don't know which tag it is but the problem was discussed on this list about a fortnight ago so you could try the archive. It may not have been committed yet. I personally fixed the issue by insuring that the mapped types matched the java tyes (well, I fiddled around 'til the error went away ;-) I make no claim for the code below other than it works for me. HTH. from mapping.xml <field name="projects" type="com.fc.cookieproject.data.ProjectData" collection="arraylist"> <sql many-key="clientId"/> <xml name="project" node="element" /> </field> In the relevant class I have private List projects = new ArrayList(); public List getProjects() { return this.projects; } public void setProjects(List proj) {this.projects = proj;} public void addProject(ProjectData addMe) { //some code that checks for duplicates before adding to the List } public void removeProject(ProjectData removeMe) { //some code, etc. } Ebersole, Steven wrote: >You mentioned the correction for the 0.9.3.9 issue. Do you no which tag I >need to checkout of CVS to get that correction? > >It seems like a problem with the reflection code not being able to handle >sub-types in the parameter list. Is this what was corrected? > > > >******************************************** >Steve Ebersole >IT Integration Engineer >Vignette Corporation >512.741.4195 > >Visit http://www.vignette.com > >******************************************** > > >-----Original Message----- >From: Patrick van Kann [mailto:[EMAIL PROTECTED]] >Sent: Monday, March 04, 2002 12:08 PM >To: [EMAIL PROTECTED] >Subject: Re: [castor-dev] Date: Fri, 1 Mar 2002 18:54:41 -0600 > > >In your earlier message you said you were using 0.93. Were you using >0.93 for the tests below? The problem you are alluding to is a known >problem of 0.93 and does not occur in 0.9.3.9. The problem you ran into >in 0.9.3.9 is also a known problem for which there are work-arounds. It >may even be fixed in the latest CVS. > >Patrick > >Ebersole, Steven wrote: > >>Thanks for the replies... >> >>Again, I am extremely new to Castor, so perhaps I just don't understand the >>consequences of certain decisions we have made. However, none of these >>explanations seem to cover why our setup works when "pulling" a single >>object through a query or load. >> >>That being said, I went back and completely scaled-back the objects to try >>some simple testing. Bascially I removed everything from the mappings >>except for Company and Location. These are mapped as bi-directional >>one-to-many (one Company to zero or more Locations). All other mapping >>elements were removed (aside from simple Java type mappings). I removed >> >the > >>caching from both objects and removed the key generation from both objects. >> >>However, I am still getting the same exact issue: when a query on company >>returns multiple companies, all previously loaded locations are >> >cumulatively > >>added to the currently loading company. >> >>Below are the two class defs, mappings, and table definitions. Please, can >>someone tell me why Castor is unable to map this simple relationship >>correctly?!? Am I just missing something fundamental in the mapping? >> >>Thanks in advance for any help this this... >> >> >> >>Mappings: >> >> <class name="com.vignette.it.apps.jdo.CompanyImpl" identity="id"> >> <description>Represents a Company from the COMPANY >>table</description> >> <map-to table="COMPANY"/> >> <cache-type type="none"/> >> <field name="id" type="integer"> >> <sql name="COMP_ID" type="integer"/> >> </field> >> <field name="name" type="string"> >> <sql name="name" type="varchar"/> >> </field> >> <field name="url" type="string"> >> <sql name="MAIN_URL" type="varchar"/> >> </field> >> <field name="locations" >> >type="com.vignette.it.apps.jdo.LocationImpl" > >> collection="vector"> >> <sql many-key="COMP_ID"/> >> </field> >> <field name="active" type="boolean"> >> <sql name="active_flg"/> >> </field> >> <field name="createdDate" type="date"> >> <sql name="CRTD_DT" type="timestamp"/> >> </field> >> <field name="modifiedDate" type="date"> >> <sql name="CHGD_DT" type="timestamp"/> >> </field> >> </class> >> >> >> <class name="com.vignette.it.apps.jdo.LocationImpl" identity="id" > >> <description>A location object mapping</description> >> <map-to table="LOCATION"/> >> <cache-type type="none"/> >> <field name="id" type="integer"> >> <sql name="LOC_ID" type="integer"/> >> </field> >> <field name="company" type="com.vignette.it.apps.jdo.CompanyImpl"> >> <sql name="COMP_ID"/> >> </field> >> <field name="description" type="string"> >> <sql name="LOC_DESC" type="varchar"/> >> </field> >> <field name="active" type="boolean"> >> <sql name="active_flg"/> >> </field> >> <field name="createdDate" type="date"> >> <sql name="CRTD_DT" type="timestamp"/> >> </field> >> <field name="modifiedDate" type="date"> >> <sql name="CHGD_DT" type="timestamp"/> >> </field> >> </class> >> >> >> >> >> >> >>The classes: >> >>public class CompanyImpl >>extends BaseImpl >>implements Company >>{ >> private Integer id; >> private String name; >> private String url; >> >> private Vector locations; >> >> >> /** Creates a new instance of Company */ >> public CompanyImpl() >> { >> locations = new Vector(); >> } >> >> public Integer getId() >> { >> return id; >> } >> >> public void setId( Integer id ) >> { >> this.id = id; >> } >> >> public String getName() >> { >> return name; >> } >> >> public void setName( String name ) >> { >> this.name = name; >> } >> >> public String getUrl() >> { >> return url; >> } >> >> public void setUrl( String url ) >> { >> this.url = url; >> } >> >> public void addLocation(LocationImpl loc) >> { >> System.out.println( "Adding location [loc_id=" + loc.getId() + >> ", comp_id=" + loc.getCompany().getId() + >> "] to this company [id=" + getId() + "]" ); >>// loc.setCompany( this ); >> locations.add( loc ); >> } >> >> public java.util.Vector getLocations() >> { >> return locations; >> } >> >>} >> >> >> >> >> >> >> >> >>public class LocationImpl >>extends BaseImpl >>implements Location >>{ >> >> private Integer id; >> private CompanyImpl comp; >> private String desc; >> >> /** Creates a new instance of LocationImpl */ >> public LocationImpl() >> { >> } >> >> public Integer getId() >> { >> return id; >> } >> >> public void setId( Integer id ) >> { >> this.id = id; >> } >> >> public String getType() >> { >> return ModelKeys.LOCATION; >> } >> >> public String getDescription() >> { >> return desc; >> } >> >> public void setDescription(String desc) >> { >> this.desc = desc; >> } >> >> public CompanyImpl getCompany() >> { >> return comp; >> } >> >> public void setCompany(CompanyImpl comp) >> { >> this.comp = comp; >> } >> >>} >> >> >> >>Table defs: >> >>SQL> desc company >>Name Null? Type >>----------------------------------------- -------- -------------- >> >>COMP_ID NOT NULL NUMBER >>PRNT_COMP_ID NUMBER >>NAME VARCHAR2(100) >>ANNUAL_REV NUMBER >>ANNUAL_REV_CURR_ID NUMBER >>POTNL_OPP NUMBER >>POTNL_OPP_CURR_ID NUMBER >>MAIN_URL VARCHAR2(250) >>FORT_LIST_ID NUMBER >>GEO_ID NUMBER >>CUST_PROD_STAT_ID NUMBER >>BUS_OBJ VARCHAR2(4000) >>BUS_DESC VARCHAR2(4000) >>ACTIVE_FLG NUMBER(1) >>CRTD_DT DATE >>CRTD_BY VARCHAR2(100) >>CHGD_DT DATE >>CHGD_BY VARCHAR2(100) >>TERR_ID NUMBER >>PENDING_APPRVL_FLG NUMBER(1) >> >>SQL> desc location >>Name Null? Type >>----------------------------------------- -------- -------------- >> >>LOC_ID NOT NULL NUMBER >>COMP_ID NOT NULL NUMBER >>LOC_DESC VARCHAR2(100) >>ACTIVE_FLG NUMBER(1) >>CRTD_DT DATE >>CRTD_BY VARCHAR2(100) >>CHGD_DT DATE >>CHGD_BY VARCHAR2(100) >> >> >> >> >> >> >> >>******************************************** >>Steve Ebersole >>IT Integration Engineer >>Vignette Corporation >>512.741.4195 >> >>Visit http://www.vignette.com >> >>******************************************** >> >> >>-----Original Message----- >>From: Bruce Snyder [mailto:[EMAIL PROTECTED]] >>Sent: Sunday, March 03, 2002 1:32 AM >>To: [EMAIL PROTECTED] >>Subject: Re: [castor-dev] Date: Fri, 1 Mar 2002 18:54:41 -0600 >> >> >>This one time, at band camp, Ebersole, Steven said: >> >>ES>We aren't actually generating anything from our Castor setup yet. Right >>now >>ES>we are only trying to get Castor to load pre-existing database rows. So >>the >>ES>key generation "shouldn't" be an issue, but thanks for the heads-up; >> >I'll > >>ES>definitely keep a close eye on that when we start trying to persist. >> >>I think that you're missing my point here. In an earlier message >>you stated that you were getting an exception stating that identity >>changes were not allowed. I wonder if the key-generator is trying >>to assign a new id to the object, hence the exception. >> >>ES>Another strange thing I just noticed: I have been using the jar marked >> >as > >>ES>castor.0.9.3.jar I just tried to replace that with castor.0.9.3.9.jar >> >to > >>ES>see if it would correct any of these issues. However, the new jar >>complains >>ES>about these collection joins saying it cannot find the appropriate >>set/add >>ES>methods. I was using collection="collection" in the mapping for these >>ES>joins, and then coding the object's get/set attribute as java.util.List. >>It >>ES>seems like that is what the new jar does not like. >> >>You are correct. The object types must be of java.util.Collection >>if in the field mapping you state that the collection type is a >>collection. I'm not aware of what may have changed between 0.9.3 >>and 0.9.3.9 to have caused this to be enforced now. I thought that >>Castor should have been enforcing this all along. >> >>ES>Attached are the three classes directly invloved; please let me know if >>you >>ES>need to see others. Also, I am using interfaces in front of the classes >>for >>ES>the UI to use. These aren't attached. Let me know if it would be >>ES>beneficial to have them also. >> >>I didn't look at these classes much. The only other thing that I >>can think to tell you is that Castor *only* support bi-directional >>relationships. It does not currently provide support for uni-directional >>relationships. For example, if A contains a relation to B, then B >>must contain a relation to A. See the examples in src/examples/myapp >>for more info. >> >>Bruce >>-- >> >>perl -e 'print >>unpack("u30","<0G)U8V4\@4VYY9&5R\"F9E<G)E=\$\!F<FEI+F-O;0\`\`");' >> >>----------------------------------------------------------- >>If you wish to unsubscribe from this mailing, send mail to >>[EMAIL PROTECTED] with a subject of: >> unsubscribe castor-dev >> >>----------------------------------------------------------- >>If you wish to unsubscribe from this mailing, send mail to >>[EMAIL PROTECTED] with a subject of: >> unsubscribe castor-dev >> > >----------------------------------------------------------- >If you wish to unsubscribe from this mailing, send mail to >[EMAIL PROTECTED] with a subject of: > unsubscribe castor-dev > >----------------------------------------------------------- >If you wish to unsubscribe from this mailing, send mail to >[EMAIL PROTECTED] with a subject of: > unsubscribe castor-dev > ----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to [EMAIL PROTECTED] with a subject of: unsubscribe castor-dev ----------------------------------------------------------- If you wish to unsubscribe from this mailing, send mail to [EMAIL PROTECTED] with a subject of: unsubscribe castor-dev
