RE: Updating instead of Inserting
I still am unable to retrieve objects from the database. I've stepped through the code, but am having problems understanding what is going on. At line 158 of org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldDirectAccessIm plNew.java setValueFor() is being called with the Field's name = clientRelationship, and the type=Class model.client.ClientRelationship. However, the target and value objects are the same object (they have the same id), and are type NewClientGroup. Shouldn't the target and value objects be of type ClientRelationship? The other thing I noticed is the second time I run my code I don't get an exception, but I also don't get the NewClientGroups. I'm assuming this has something to do with the caching... -Original Message- From: Lemke, Wesley Sent: Tuesday, March 22, 2005 12:55 PM To: 'OJB Users List' Subject: RE: Updating instead of Inserting I am persisting the objects fine now, but I am getting an error when retrieving: [3/22/05 12:44:43:008 CST] 39432342 SystemOut O [PersistentField] ERROR: while set field: [try to set 'object value' in 'target object' target obj class: model.client.NewClientGroup target field name: clientRelationship target field type: class model.client.ClientRelationship object value class: model.client.NewClientGroup object value: [EMAIL PROTECTED] ] Here are the pertinent parts of repository.xml: In the class-descriptor for ClientRelationship: collection-descriptor name=clientGroups element-class-ref=model.client.NewClientGroup auto-delete=true auto-update=true inverse-foreignkey field-ref=clientRelationshipId / /collection-descriptor In the class-descriptor for NewClientGroup: reference-descriptor name=clientRelationship class-ref=model.client.ClientRelationship foreignkey field-ref=objectId/ /reference-descriptor In the NewClientGroup Class: private ClientRelationship clientRelationship; // with getter and setter defined. Here is the code I am running: Query q = new QueryByCriteria(ClientRelationship.class); Collection clientRelationships = broker.getCollectionByQuery(q); -- exception thrown here. Iterator i = clientRelationships.iterator(); writer.println(brbr); while (i.hasNext()) { ClientRelationship cr2 = (ClientRelationship) i.next(); writer.println(cr2.getNameOfApproverOfNoContract()); List clientGroups = cr2.getClientGroups(); } I am assuming that when OJB pulls back the ClientRelationships, it is also pulling back the collection of NewClientGroups (and Subgroups). When it instantiates the NewClientGroup it is trying to set the clientRelationship field. Why is it trying to set it to a NewClientGroup, instead of the associated ClientRelationship? Here is the entire stack trace if it helps: [3/22/05 12:44:42:998 CST] 39432342 SystemOut O [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] DEBUG: SQL:SELECT A0.CLASS_NAME,A0.client_grp_id,A0.INN_CLIENT_NB,A0.client_id,A0.LAST_MOD IFIED_USER,A0.SDD_COMP_I,A0.LAST_NAME_DT,A0.ETL_CLIENT_ID,A0.KEY_WORDS,A 0.LAST_NAME,A0.MAIL_MEMBERS,A0.PRIMARY_GRP_I,A0.group_id,A0.COMMENTS,A0. REPORTS_DESC,A0.EFF_DT,A0.NAME FROM client_group A0 WHERE ( A0.client_id = ?) AND (A0.CLASS_NAME = ?) [3/22/05 12:44:43:078 CST] 39432342 SystemErr R org.apache.ojb.broker.metadata.MetadataException: IllegalAccess error setting field:clientRelationship in object:model.client.NewClientGroup at org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldDirectAccessIm plNew.setValueFor(Unknown Source) at org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldDirectAccessIm plNew.set(Unknown Source) at org.apache.ojb.broker.core.QueryReferenceBroker.retrieveReference(Unknow n Source) at org.apache.ojb.broker.core.QueryReferenceBroker.retrieveReferences(Unkno wn Source) at org.apache.ojb.broker.accesslayer.RsIterator.getObjectFromResultSet(Unkn own Source) at org.apache.ojb.broker.accesslayer.RsIterator.next(Unknown Source) at org.apache.ojb.broker.accesslayer.BasePrefetcher.prefetchRelationship(Un known Source) at org.apache.ojb.broker.core.QueryReferenceBroker.performRetrievalTasks(Un known Source) at org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(Unk nown Source) at org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(Unk nown Source) at org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(Unk nown Source) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getCollectionByQuery(Un known Source
Re: Updating instead of Inserting
Hi Wes, sure that this mapping is correct? In the class-descriptor for NewClientGroup: reference-descriptor name=clientRelationship class-ref=model.client.ClientRelationship foreignkey field-ref=objectId/ /reference-descriptor I assume that objectId is still the PK field of NewClientGroup. You need a FK field refering to ClientRelationship. In your previous mail you said that you are using ojbConcrete class feature, this explains why you get [try to set 'object value' in 'target object' target obj class: model.client.NewClientGroup target field name: clientRelationship target field type: class model.client.ClientRelationship object value class: model.client.NewClientGroup object value: [EMAIL PROTECTED] ] field type is correct, but objectId refer to concrete class NewClientGroup -- bang! regards, Armin Lemke, Wesley wrote: I still am unable to retrieve objects from the database. I've stepped through the code, but am having problems understanding what is going on. At line 158 of org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldDirectAccessIm plNew.java setValueFor() is being called with the Field's name = clientRelationship, and the type=Class model.client.ClientRelationship. However, the target and value objects are the same object (they have the same id), and are type NewClientGroup. Shouldn't the target and value objects be of type ClientRelationship? The other thing I noticed is the second time I run my code I don't get an exception, but I also don't get the NewClientGroups. I'm assuming this has something to do with the caching... -Original Message- From: Lemke, Wesley Sent: Tuesday, March 22, 2005 12:55 PM To: 'OJB Users List' Subject: RE: Updating instead of Inserting I am persisting the objects fine now, but I am getting an error when retrieving: [3/22/05 12:44:43:008 CST] 39432342 SystemOut O [PersistentField] ERROR: while set field: [try to set 'object value' in 'target object' target obj class: model.client.NewClientGroup target field name: clientRelationship target field type: class model.client.ClientRelationship object value class: model.client.NewClientGroup object value: [EMAIL PROTECTED] ] Here are the pertinent parts of repository.xml: In the class-descriptor for ClientRelationship: collection-descriptor name=clientGroups element-class-ref=model.client.NewClientGroup auto-delete=true auto-update=true inverse-foreignkey field-ref=clientRelationshipId / /collection-descriptor In the class-descriptor for NewClientGroup: reference-descriptor name=clientRelationship class-ref=model.client.ClientRelationship foreignkey field-ref=objectId/ /reference-descriptor In the NewClientGroup Class: private ClientRelationship clientRelationship; // with getter and setter defined. Here is the code I am running: Query q = new QueryByCriteria(ClientRelationship.class); Collection clientRelationships = broker.getCollectionByQuery(q); -- exception thrown here. Iterator i = clientRelationships.iterator(); writer.println(brbr); while (i.hasNext()) { ClientRelationship cr2 = (ClientRelationship) i.next(); writer.println(cr2.getNameOfApproverOfNoContract()); List clientGroups = cr2.getClientGroups(); } I am assuming that when OJB pulls back the ClientRelationships, it is also pulling back the collection of NewClientGroups (and Subgroups). When it instantiates the NewClientGroup it is trying to set the clientRelationship field. Why is it trying to set it to a NewClientGroup, instead of the associated ClientRelationship? Here is the entire stack trace if it helps: [3/22/05 12:44:42:998 CST] 39432342 SystemOut O [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] DEBUG: SQL:SELECT A0.CLASS_NAME,A0.client_grp_id,A0.INN_CLIENT_NB,A0.client_id,A0.LAST_MOD IFIED_USER,A0.SDD_COMP_I,A0.LAST_NAME_DT,A0.ETL_CLIENT_ID,A0.KEY_WORDS,A 0.LAST_NAME,A0.MAIL_MEMBERS,A0.PRIMARY_GRP_I,A0.group_id,A0.COMMENTS,A0. REPORTS_DESC,A0.EFF_DT,A0.NAME FROM client_group A0 WHERE ( A0.client_id = ?) AND (A0.CLASS_NAME = ?) [3/22/05 12:44:43:078 CST] 39432342 SystemErr R org.apache.ojb.broker.metadata.MetadataException: IllegalAccess error setting field:clientRelationship in object:model.client.NewClientGroup at org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldDirectAccessIm plNew.setValueFor(Unknown Source) at org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldDirectAccessIm plNew.set(Unknown Source) at org.apache.ojb.broker.core.QueryReferenceBroker.retrieveReference(Unknow n Source) at org.apache.ojb.broker.core.QueryReferenceBroker.retrieveReferences(Unkno wn
Re: Updating instead of Inserting
hi wesley, it looks like you are using th pk of NewClientGroup as fk pointing to ClientRelationship. imo the field 'clientRelationshipId' shouls be used here. jakob Lemke, Wesley schrieb: I still am unable to retrieve objects from the database. I've stepped through the code, but am having problems understanding what is going on. At line 158 of org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldDirectAccessIm plNew.java setValueFor() is being called with the Field's name = clientRelationship, and the type=Class model.client.ClientRelationship. However, the target and value objects are the same object (they have the same id), and are type NewClientGroup. Shouldn't the target and value objects be of type ClientRelationship? The other thing I noticed is the second time I run my code I don't get an exception, but I also don't get the NewClientGroups. I'm assuming this has something to do with the caching... -Original Message- From: Lemke, Wesley Sent: Tuesday, March 22, 2005 12:55 PM To: 'OJB Users List' Subject: RE: Updating instead of Inserting I am persisting the objects fine now, but I am getting an error when retrieving: [3/22/05 12:44:43:008 CST] 39432342 SystemOut O [PersistentField] ERROR: while set field: [try to set 'object value' in 'target object' target obj class: model.client.NewClientGroup target field name: clientRelationship target field type: class model.client.ClientRelationship object value class: model.client.NewClientGroup object value: [EMAIL PROTECTED] ] Here are the pertinent parts of repository.xml: In the class-descriptor for ClientRelationship: collection-descriptor name=clientGroups element-class-ref=model.client.NewClientGroup auto-delete=true auto-update=true inverse-foreignkey field-ref=clientRelationshipId / /collection-descriptor In the class-descriptor for NewClientGroup: reference-descriptor name=clientRelationship class-ref=model.client.ClientRelationship foreignkey field-ref=objectId/ /reference-descriptor In the NewClientGroup Class: private ClientRelationship clientRelationship; // with getter and setter defined. Here is the code I am running: Query q = new QueryByCriteria(ClientRelationship.class); Collection clientRelationships = broker.getCollectionByQuery(q); -- exception thrown here. Iterator i = clientRelationships.iterator(); writer.println(brbr); while (i.hasNext()) { ClientRelationship cr2 = (ClientRelationship) i.next(); writer.println(cr2.getNameOfApproverOfNoContract()); List clientGroups = cr2.getClientGroups(); } I am assuming that when OJB pulls back the ClientRelationships, it is also pulling back the collection of NewClientGroups (and Subgroups). When it instantiates the NewClientGroup it is trying to set the clientRelationship field. Why is it trying to set it to a NewClientGroup, instead of the associated ClientRelationship? Here is the entire stack trace if it helps: [3/22/05 12:44:42:998 CST] 39432342 SystemOut O [org.apache.ojb.broker.accesslayer.sql.SqlGeneratorDefaultImpl] DEBUG: SQL:SELECT A0.CLASS_NAME,A0.client_grp_id,A0.INN_CLIENT_NB,A0.client_id,A0.LAST_MOD IFIED_USER,A0.SDD_COMP_I,A0.LAST_NAME_DT,A0.ETL_CLIENT_ID,A0.KEY_WORDS,A 0.LAST_NAME,A0.MAIL_MEMBERS,A0.PRIMARY_GRP_I,A0.group_id,A0.COMMENTS,A0. REPORTS_DESC,A0.EFF_DT,A0.NAME FROM client_group A0 WHERE ( A0.client_id = ?) AND (A0.CLASS_NAME = ?) [3/22/05 12:44:43:078 CST] 39432342 SystemErr R org.apache.ojb.broker.metadata.MetadataException: IllegalAccess error setting field:clientRelationship in object:model.client.NewClientGroup at org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldDirectAccessIm plNew.setValueFor(Unknown Source) at org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldDirectAccessIm plNew.set(Unknown Source) at org.apache.ojb.broker.core.QueryReferenceBroker.retrieveReference(Unknow n Source) at org.apache.ojb.broker.core.QueryReferenceBroker.retrieveReferences(Unkno wn Source) at org.apache.ojb.broker.accesslayer.RsIterator.getObjectFromResultSet(Unkn own Source) at org.apache.ojb.broker.accesslayer.RsIterator.next(Unknown Source) at org.apache.ojb.broker.accesslayer.BasePrefetcher.prefetchRelationship(Un known Source) at org.apache.ojb.broker.core.QueryReferenceBroker.performRetrievalTasks(Un known Source) at org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(Unk nown Source) at org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(Unk nown Source) at org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(Unk nown Source
Updating instead of Inserting
I have 4 classes: AdmObject -- highlevel class that all of our persistent classes extend. Contains objectId field. Generic Group -- Abstract. Extends AdmObject. Contains common fields for NewClientGroup and Subgroup and the ojbConcreteClass. NewClientGroup -- extends Generic Group, contains a collection of Subgroups. Subgroup -- extends Generic Group. Has a reference to the NewClientGroup. I am trying to persist NewClientGroup and Subgroup (along with common fields in Generic Group) to the same table. Here is a portion of my mapping document (most of the common fields from Generic group are removed to simplifiy): class-descriptor class=model.AdmObject extent-class class-ref=model.client.GenericGroup / /class-descriptor class-descriptor class=model.client.GenericGroup extent-class class-ref=model.client.Subgroup / extent-class class-ref=model.client.NewClientGroup / /class-descriptor class-descriptor class=model.client.NewClientGroup table=client_group field-descriptor name=objectId column=group_id jdbc-type=INTEGER primarykey=true autoincrement=true access=readonly / field-descriptor name=internalClientNumber column=INN_CLIENT_NB jdbc-type=VARCHAR / field-descriptor name=ojbConcreteClass column=CLASS_NAME jdbc-type=VARCHAR / collection-descriptor name=subgroups element-class-ref=model.client.Subgroup auto-delete=true auto-update=true inverse-foreignkey field-ref=objectId / /collection-descriptor /class-descriptor class-descriptor class=model.client.Subgroup table=client_group field-descriptor name=objectId column=group_id jdbc-type=INTEGER primarykey=true autoincrement=true access=readonly / field-descriptor name=name column=NAME jdbc-type=VARCHAR / field-descriptor name=ojbConcreteClass column=CLASS_NAME jdbc-type=VARCHAR / reference-descriptor name=clientGroup class-ref=model.client.NewClientGroup foreignkey field-ref=objectId/ /reference-descriptor /class-descriptor Here is the code I am using: broker.beginTransaction(); NewClientGroup ncg = new NewClientGroup(); ncg.setInternalClientNumber(IntClntNbr); Subgroup sg = new Subgroup(); sg.setName(FirstSubgroup); ncg.addSubgroup(sg); Subgroup sg2 = new Subgroup(); sg.setName(Second Subgroup); ncg.addSubgroup(sg2); broker.store(ncg); broker.commitTransaction(); I would assume that after the above code, there would be one NewClientGroup and 2 Subgroups in my client_group table. However, there is only one row, the Second Subgroup. Here is the debug SQL generated: DEBUG: SQL:INSERT INTO client_group (INN_CLIENT_NB,CLASS_NAME) VALUES (?,?) DEBUG: SQL:UPDATE client_group SET NAME=?,CLASS_NAME=? WHERE group_id = ? Am I doing something wrong with my mapping or code? Is it possible to persist these classes to the same table? Any help would be appreciated. Thanks, Wes - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
Re: Updating instead of Inserting
Hi Wes, why did you need mapping for AdmObject when only one class extent AdmObject? In mapping for NCG collection-descriptor name=subgroups element-class-ref=model.client.Subgroup auto-delete=true auto-update=true inverse-foreignkey field-ref=objectId / /collection-descriptor the inverse-foreignkey refer to the PK field of SG. Think this is not correct, you need a FK field in SG to store the PK value of NCG. This FK field must also be used by the 'clientGroup' reference in SG [don't use an anomymous field, because of the 1:n relation http://db.apache.org/ojb/docu/guides/advanced-technique.html#How+do+ ] regards, Armin Lemke, Wesley wrote: I have 4 classes: AdmObject -- highlevel class that all of our persistent classes extend. Contains objectId field. Generic Group -- Abstract. Extends AdmObject. Contains common fields for NewClientGroup and Subgroup and the ojbConcreteClass. NewClientGroup -- extends Generic Group, contains a collection of Subgroups. Subgroup -- extends Generic Group. Has a reference to the NewClientGroup. I am trying to persist NewClientGroup and Subgroup (along with common fields in Generic Group) to the same table. Here is a portion of my mapping document (most of the common fields from Generic group are removed to simplifiy): class-descriptor class=model.AdmObject extent-class class-ref=model.client.GenericGroup / /class-descriptor class-descriptor class=model.client.GenericGroup extent-class class-ref=model.client.Subgroup / extent-class class-ref=model.client.NewClientGroup / /class-descriptor class-descriptor class=model.client.NewClientGroup table=client_group field-descriptor name=objectId column=group_id jdbc-type=INTEGER primarykey=true autoincrement=true access=readonly / field-descriptor name=internalClientNumber column=INN_CLIENT_NB jdbc-type=VARCHAR / field-descriptor name=ojbConcreteClass column=CLASS_NAME jdbc-type=VARCHAR / collection-descriptor name=subgroups element-class-ref=model.client.Subgroup auto-delete=true auto-update=true inverse-foreignkey field-ref=objectId / /collection-descriptor /class-descriptor class-descriptor class=model.client.Subgroup table=client_group field-descriptor name=objectId column=group_id jdbc-type=INTEGER primarykey=true autoincrement=true access=readonly / field-descriptor name=name column=NAME jdbc-type=VARCHAR / field-descriptor name=ojbConcreteClass column=CLASS_NAME jdbc-type=VARCHAR / reference-descriptor name=clientGroup class-ref=model.client.NewClientGroup foreignkey field-ref=objectId/ /reference-descriptor /class-descriptor Here is the code I am using: broker.beginTransaction(); NewClientGroup ncg = new NewClientGroup(); ncg.setInternalClientNumber(IntClntNbr); Subgroup sg = new Subgroup(); sg.setName(FirstSubgroup); ncg.addSubgroup(sg); Subgroup sg2 = new Subgroup(); sg.setName(Second Subgroup); ncg.addSubgroup(sg2); broker.store(ncg); broker.commitTransaction(); I would assume that after the above code, there would be one NewClientGroup and 2 Subgroups in my client_group table. However, there is only one row, the Second Subgroup. Here is the debug SQL generated: DEBUG: SQL:INSERT INTO client_group (INN_CLIENT_NB,CLASS_NAME) VALUES (?,?) DEBUG: SQL:UPDATE client_group SET NAME=?,CLASS_NAME=? WHERE group_id = ? Am I doing something wrong with my mapping or code? Is it possible to persist these classes to the same table? Any help would be appreciated. Thanks, Wes - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
RE: Updating instead of Inserting
Thanks Armen, that worked. I've made this same mistake before, you would think I'd learn :) The AdmObject will have many more extents in the full application. Every persistent class will extend it, or a subclass of it. I only had one class extending it in this subset. -Original Message- From: Armin Waibel [mailto:[EMAIL PROTECTED] Sent: Tuesday, March 22, 2005 8:38 AM To: OJB Users List Subject: Re: Updating instead of Inserting Hi Wes, why did you need mapping for AdmObject when only one class extent AdmObject? In mapping for NCG collection-descriptor name=subgroups element-class-ref=model.client.Subgroup auto-delete=true auto-update=true inverse-foreignkey field-ref=objectId / /collection-descriptor the inverse-foreignkey refer to the PK field of SG. Think this is not correct, you need a FK field in SG to store the PK value of NCG. This FK field must also be used by the 'clientGroup' reference in SG [don't use an anomymous field, because of the 1:n relation http://db.apache.org/ojb/docu/guides/advanced-technique.html#How+do+ ] regards, Armin Lemke, Wesley wrote: I have 4 classes: AdmObject -- highlevel class that all of our persistent classes extend. Contains objectId field. Generic Group -- Abstract. Extends AdmObject. Contains common fields for NewClientGroup and Subgroup and the ojbConcreteClass. NewClientGroup -- extends Generic Group, contains a collection of Subgroups. Subgroup -- extends Generic Group. Has a reference to the NewClientGroup. I am trying to persist NewClientGroup and Subgroup (along with common fields in Generic Group) to the same table. Here is a portion of my mapping document (most of the common fields from Generic group are removed to simplifiy): class-descriptor class=model.AdmObject extent-class class-ref=model.client.GenericGroup / /class-descriptor class-descriptor class=model.client.GenericGroup extent-class class-ref=model.client.Subgroup / extent-class class-ref=model.client.NewClientGroup / /class-descriptor class-descriptor class=model.client.NewClientGroup table=client_group field-descriptor name=objectId column=group_id jdbc-type=INTEGER primarykey=true autoincrement=true access=readonly / field-descriptor name=internalClientNumber column=INN_CLIENT_NB jdbc-type=VARCHAR / field-descriptor name=ojbConcreteClass column=CLASS_NAME jdbc-type=VARCHAR / collection-descriptor name=subgroups element-class-ref=model.client.Subgroup auto-delete=true auto-update=true inverse-foreignkey field-ref=objectId / /collection-descriptor /class-descriptor class-descriptor class=model.client.Subgroup table=client_group field-descriptor name=objectId column=group_id jdbc-type=INTEGER primarykey=true autoincrement=true access=readonly / field-descriptor name=name column=NAME jdbc-type=VARCHAR / field-descriptor name=ojbConcreteClass column=CLASS_NAME jdbc-type=VARCHAR / reference-descriptor name=clientGroup class-ref=model.client.NewClientGroup foreignkey field-ref=objectId/ /reference-descriptor /class-descriptor Here is the code I am using: broker.beginTransaction(); NewClientGroup ncg = new NewClientGroup(); ncg.setInternalClientNumber(IntClntNbr); Subgroup sg = new Subgroup(); sg.setName(FirstSubgroup); ncg.addSubgroup(sg); Subgroup sg2 = new Subgroup(); sg.setName(Second Subgroup); ncg.addSubgroup(sg2); broker.store(ncg); broker.commitTransaction(); I would assume that after the above code, there would be one NewClientGroup and 2 Subgroups in my client_group table. However, there is only one row, the Second Subgroup. Here is the debug SQL generated: DEBUG: SQL:INSERT INTO client_group (INN_CLIENT_NB,CLASS_NAME) VALUES (?,?) DEBUG: SQL:UPDATE client_group SET NAME=?,CLASS_NAME=? WHERE group_id = ? Am I doing something wrong with my mapping or code? Is it possible to persist these classes to the same table? Any help would be appreciated. Thanks, Wes
Re: Updating instead of Inserting
Lemke, Wesley wrote: Thanks Armen, that worked. I've made this same mistake before, you would think I'd learn :) ...you are in good company, the history of mankind is an endless list of repeated mistakes ;-) The AdmObject will have many more extents in the full application. Every persistent class will extend it, or a subclass of it. I only had one class extending it in this subset. I ask this each time, because using inheritance can be a performance killer and should be avoided if possible. So if you don't regular need query for AdmObject's, don't declare the mapping. Armin -Original Message- From: Armin Waibel [mailto:[EMAIL PROTECTED] Sent: Tuesday, March 22, 2005 8:38 AM To: OJB Users List Subject: Re: Updating instead of Inserting Hi Wes, why did you need mapping for AdmObject when only one class extent AdmObject? In mapping for NCG collection-descriptor name=subgroups element-class-ref=model.client.Subgroup auto-delete=true auto-update=true inverse-foreignkey field-ref=objectId / /collection-descriptor the inverse-foreignkey refer to the PK field of SG. Think this is not correct, you need a FK field in SG to store the PK value of NCG. This FK field must also be used by the 'clientGroup' reference in SG [don't use an anomymous field, because of the 1:n relation http://db.apache.org/ojb/docu/guides/advanced-technique.html#How+do+ ] regards, Armin Lemke, Wesley wrote: I have 4 classes: AdmObject -- highlevel class that all of our persistent classes extend. Contains objectId field. Generic Group -- Abstract. Extends AdmObject. Contains common fields for NewClientGroup and Subgroup and the ojbConcreteClass. NewClientGroup -- extends Generic Group, contains a collection of Subgroups. Subgroup -- extends Generic Group. Has a reference to the NewClientGroup. I am trying to persist NewClientGroup and Subgroup (along with common fields in Generic Group) to the same table. Here is a portion of my mapping document (most of the common fields from Generic group are removed to simplifiy): class-descriptor class=model.AdmObject extent-class class-ref=model.client.GenericGroup / /class-descriptor class-descriptor class=model.client.GenericGroup extent-class class-ref=model.client.Subgroup / extent-class class-ref=model.client.NewClientGroup / /class-descriptor class-descriptor class=model.client.NewClientGroup table=client_group field-descriptor name=objectId column=group_id jdbc-type=INTEGER primarykey=true autoincrement=true access=readonly / field-descriptor name=internalClientNumber column=INN_CLIENT_NB jdbc-type=VARCHAR / field-descriptor name=ojbConcreteClass column=CLASS_NAME jdbc-type=VARCHAR / collection-descriptor name=subgroups element-class-ref=model.client.Subgroup auto-delete=true auto-update=true inverse-foreignkey field-ref=objectId / /collection-descriptor /class-descriptor class-descriptor class=model.client.Subgroup table=client_group field-descriptor name=objectId column=group_id jdbc-type=INTEGER primarykey=true autoincrement=true access=readonly / field-descriptor name=name column=NAME jdbc-type=VARCHAR / field-descriptor name=ojbConcreteClass column=CLASS_NAME jdbc-type=VARCHAR / reference-descriptor name=clientGroup class-ref=model.client.NewClientGroup foreignkey field-ref=objectId/ /reference-descriptor /class-descriptor Here is the code I am using: broker.beginTransaction(); NewClientGroup ncg = new NewClientGroup(); ncg.setInternalClientNumber(IntClntNbr); Subgroup sg = new Subgroup(); sg.setName(FirstSubgroup); ncg.addSubgroup(sg); Subgroup sg2 = new Subgroup(); sg.setName(Second Subgroup); ncg.addSubgroup(sg2); broker.store(ncg); broker.commitTransaction(); I would assume that after the above code, there would be one NewClientGroup and 2 Subgroups in my client_group table. However, there is only one row, the Second Subgroup. Here is the debug SQL generated: DEBUG: SQL:INSERT INTO client_group (INN_CLIENT_NB,CLASS_NAME) VALUES (?,?) DEBUG: SQL:UPDATE client_group SET NAME=?,CLASS_NAME=? WHERE group_id = ? Am I doing something wrong with my mapping or code? Is it possible to persist these classes to the same table? Any help would be appreciated. Thanks, Wes - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] - To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED
RE: Updating instead of Inserting
) at com.ibm.ws.webcontainer.servlet.ServletInstanceReference.dispatch(Servle tInstanceReference.java:40) at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.handleWebAppDispa tch(WebAppRequestDispatcher.java:948) at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRe questDispatcher.java:530) at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppReq uestDispatcher.java:176) at com.ibm.ws.webcontainer.servlet.InvokerServlet.service(InvokerServlet.ja va:255) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at com.ibm.ws.webcontainer.servlet.StrictServletInstance.doService(StrictSe rvletInstance.java:110) at com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet._service(StrictLi fecycleServlet.java:174) at com.ibm.ws.webcontainer.servlet.IdleServletState.service(StrictLifecycle Servlet.java:313) at com.ibm.ws.webcontainer.servlet.StrictLifecycleServlet.service(StrictLif ecycleServlet.java:116) at com.ibm.ws.webcontainer.servlet.ServletInstance.service(ServletInstance. java:283) at com.ibm.ws.webcontainer.servlet.ValidServletReferenceState.dispatch(Vali dServletReferenceState.java:42) at com.ibm.ws.webcontainer.servlet.ServletInstanceReference.dispatch(Servle tInstanceReference.java:40) at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.handleWebAppDispa tch(WebAppRequestDispatcher.java:948) at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.dispatch(WebAppRe questDispatcher.java:530) at com.ibm.ws.webcontainer.webapp.WebAppRequestDispatcher.forward(WebAppReq uestDispatcher.java:176) at com.ibm.ws.webcontainer.srt.WebAppInvoker.doForward(WebAppInvoker.java:7 9) at com.ibm.ws.webcontainer.srt.WebAppInvoker.handleInvocationHook(WebAppInv oker.java:201) at com.ibm.ws.webcontainer.cache.invocation.CachedInvocation.handleInvocati on(CachedInvocation.java:71) at com.ibm.ws.webcontainer.srp.ServletRequestProcessor.dispatchByURI(Servle tRequestProcessor.java:182) at com.ibm.ws.webcontainer.oselistener.OSEListenerDispatcher.service(OSELis tener.java:334) at com.ibm.ws.webcontainer.http.HttpConnection.handleRequest(HttpConnection .java:56) at com.ibm.ws.http.HttpConnection.readAndHandleRequest(HttpConnection.java: 610) at com.ibm.ws.http.HttpConnection.run(HttpConnection.java:431) at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:593) Caused by: org.apache.ojb.broker.metadata.MetadataException: IllegalAccess error setting field:clientRelationship in object:model.client.NewClientGroup at org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldDirectAccessIm plNew.setValueFor(Unknown Source) at org.apache.ojb.broker.metadata.fieldaccess.PersistentFieldDirectAccessIm plNew.set(Unknown Source) at org.apache.ojb.broker.core.QueryReferenceBroker.retrieveReference(Unknow n Source) at org.apache.ojb.broker.core.QueryReferenceBroker.retrieveReferences(Unkno wn Source) at org.apache.ojb.broker.accesslayer.RsIterator.getObjectFromResultSet(Unkn own Source) at org.apache.ojb.broker.accesslayer.RsIterator.next(Unknown Source) at org.apache.ojb.broker.accesslayer.BasePrefetcher.prefetchRelationship(Un known Source) at org.apache.ojb.broker.core.QueryReferenceBroker.performRetrievalTasks(Un known Source) at org.apache.ojb.broker.core.QueryReferenceBroker.getCollectionByQuery(Unk nown Source) ... 40 more Caused by: java.lang.IllegalArgumentException: field type mismatch at java.lang.reflect.Field.set(Native Method) ... 49 more -Original Message- From: Armin Waibel [mailto:[EMAIL PROTECTED] Sent: Tuesday, March 22, 2005 9:22 AM To: OJB Users List Subject: Re: Updating instead of Inserting Lemke, Wesley wrote: Thanks Armen, that worked. I've made this same mistake before, you would think I'd learn :) ...you are in good company, the history of mankind is an endless list of repeated mistakes ;-) The AdmObject will have many more extents in the full application. Every persistent class will extend it, or a subclass of it. I only had one class extending it in this subset. I ask this each time, because using inheritance can be a performance killer and should be avoided if possible. So if you don't regular need query for AdmObject's, don't declare the mapping. Armin -Original Message- From: Armin Waibel [mailto:[EMAIL PROTECTED] Sent: Tuesday, March 22, 2005 8:38 AM To: OJB Users List Subject: Re: Updating instead of Inserting Hi Wes, why did you need mapping for AdmObject when only one class extent AdmObject? In mapping for NCG collection-descriptor name=subgroups element-class-ref=model.client.Subgroup auto-delete=true auto-update=true inverse-foreignkey field-ref=objectId