Thanks Adriano, as you have mentioned, there is a mapping available for
Table<->Type and Column<->Property in
<Table> element in DAS Config. So there is no need to duplicate it in
<Relationship> and <KeyPair> and it
can be referenced from <Table> when available. The logic used to fix the
issue, such that, in case a <Table> entry is
found in <Config>, it is used for the above mapping, else default behavior
(typeName=tableName and propName=colName)
is assumed.
Based on this, I have modified:-
1) MappingWrapper.getRelationshipsByChildTable(name - SDO prop name) and
2) DatabaseObject.initialize() and get(parameter - SDO prop name)
Also, added 2 test cases to
RelationshipTests - testRelationshipTypesAndProperties() and
testRelationshipWithProgrammaticConfig()
The relevant JIRA is TUSCANY-1865.
Regards,
Amita
On 10/23/07, Adriano Crestani <[EMAIL PROTECTED]> wrote:
>
> Hi Amita,
>
> On DAS C++ when a relationship is found, for example, between table A and
> table B, it looks for their Table object in the Config, then, it it's
> defined on the Config their type name can be retrieved using
> tableA.getTypeName(). The same happens for the Column. It only assumes the
> type name to be the table name if it's not defined on the Config.
>
> If you are saying that the methods below are always assuming the type name
> being the table name, so I think they should be corrected.
>
> MappingWrapper-
> getRelationshipByReference()
> getRelationshipsByChildTable()
>
> DatabaseObject-
> initialize()
>
> Regards,
> Adriano Crestani
>
> On 10/23/07, Amita Vadhavkar <[EMAIL PROTECTED]> wrote:
> >
> > In RDB DAS, the config model has relationship definition as below:-
> > <xsd:complexType name="Relationship">
> > <xsd:sequence>
> > <xsd:element maxOccurs="unbounded" minOccurs="0"
> name="KeyPair"
> > type="config:KeyPair"/>
> > </xsd:sequence>
> > <xsd:attribute name="name" type="xsd:string"/>
> > <xsd:attribute name="primaryKeyTable" type="xsd:string"/>
> > <xsd:attribute name="foreignKeyTable" type="xsd:string"/>
> > <xsd:attribute name="many" type="xsd:boolean"/>
> > <xsd:attribute name="keyRestricted" type="xsd:boolean"/>
> > </xsd:complexType>
> >
> >
> > <xsd:complexType name="KeyPair">
> > <xsd:attribute name="primaryKeyColumn" type="xsd:string"/>
> > <xsd:attribute name="foreignKeyColumn" type="xsd:string"/>
> > </xsd:complexType>
> >
> > So, it does not have a place to store Table<->Type and Column<->Property
> > mapping.
> >
> > Also some methods below show that,they are always assuming TableName
> same
> > as
> > TypeName and ColumnName same as PropertyName.
> > e.g.
> >
> > MappingWrapper-
> > getRelationshipByReference()
> > getRelationshipsByChildTable()
> >
> > DatabaseObject-
> > initialize()
> >
> > Thus, in case the das config xml has defined different table/type and
> > column/property names and the tables have relationship,
> > the CUD operations based on relationship is not succeeding.
> >
> > e.g. When a das config has -
> >
> _________________________________________________________________________
> > <Table tableName="CUSTOMER" typeName="Customer">
> > <Column columnName="ID" propertyName="ID" primaryKey="true"/>
> > <Column columnName="LASTNAME" propertyName="lastName"/>
> > <Column columnName="ADDRESS" propertyName="address"/>
> > </Table>
> >
> > <Table tableName="ANORDER" typeName="AnOrder">
> > <Column columnName="ID" propertyName="OrderId"
> primaryKey="true"/>
> > </Table>
> >
> > <Relationship name="orders" primaryKeyTable="CUSTOMER"
> > foreignKeyTable="ANORDER" many="true">
> > <KeyPair primaryKeyColumn="ID" foreignKeyColumn="CUSTOMER_ID"/>
> > </Relationship>
> >
> _________________________________________________________________________
> > The below test case results in AnOrder record in DB with CUSTOMER_ID
> null,
> > as the relationship is not properly picked.
> >
> >
> _________________________________________________________________________________________________________
> > public void testRelationshipTypesAndProperties1() throws Exception {
> > //existing records
> > DAS das = DAS.FACTORY.createDAS(getConfig("
> > CustomersOrdersConfigProps.xml"), getConnection());
> > Command cmd = das.getCommand("customer and orders");
> > cmd.setParameter("ID", new Integer(1));
> > DataObject root = cmd.executeQuery();
> > DataObject firstCustomer = root.getDataObject("Customer[ID=1]");
> > System.out.println(XMLHelper.INSTANCE.save(firstCustomer,
> > "beforeInsertInDG", "beforeInsertInDG"));
> >
> > DataObject newOrder = root.createDataObject("AnOrder");
> > newOrder.setInt("OrderId", 100);
> > newOrder.setString("PRODUCT", "MyProd");
> >
> > firstCustomer.getList("orders").add(newOrder);
> >
> > System.out.println(XMLHelper.INSTANCE.save(firstCustomer,
> > "afterInsertInDG", "afterInsertInDG"));
> > das.applyChanges(root);
> >
> > root = cmd.executeQuery();
> > firstCustomer = root.getDataObject("Customer[ID=1]");
> > System.out.println(XMLHelper.INSTANCE.save(firstCustomer,
> > "fromDB",
> > "fromDB"));
> > }
> >
> >
> ___________________________________________________________________________________________________________
> >
> > Solution:
> > <xsd:complexType name="Relationship">
> > <xsd:sequence>
> > <xsd:element maxOccurs="unbounded" minOccurs="0"
> name="KeyPair"
> > type="config:KeyPair"/>
> > </xsd:sequence>
> > <xsd:attribute name="name" type="xsd:string"/>
> > <xsd:attribute name="primaryKeyTable" type="xsd:string"/>
> > <xsd:attribute name="primaryKeyType" type="xsd:string"/>
> > <xsd:attribute name="foreignKeyTable" type="xsd:string"/>
> > <xsd:attribute name="foreignKeyType" type="xsd:string"/>
> > <xsd:attribute name="many" type="xsd:boolean"/>
> > <xsd:attribute name="keyRestricted" type="xsd:boolean"/>
> > </xsd:complexType>
> >
> > <xsd:complexType name="KeyPair">
> > <xsd:attribute name="primaryKeyColumn" type="xsd:string"/>
> > <xsd:attribute name="primaryKeyColProperty" type="xsd:string"/>
> > <xsd:attribute name="foreignKeyColumn" type="xsd:string"/>
> > <xsd:attribute name="foreignKeyColProperty" type="xsd:string"/>
> > </xsd:complexType>
> >
> > and all relevant changes in code to support this config model.
> >
> > Suggestions?
> >
> > Regards,
> > Amita
> >
>