You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@tuscany.apache.org by Amita Vadhavkar <am...@gmail.com> on 2007/11/07 12:58:27 UTC

[DAS] need to correct condition check in UpdateGenerator

Link to JIRA - https://issues.apache.org/jira/browse/TUSCANY-1895

RDB DAS - UpdateGenerator performs incorrect check when passing
property values from parent DO to child DO. It tries to find
the FK property in Parent DO and gives exception. code
.....UdateGenerator.getChangedFields() - if (!ref.isMany()) {.....

This might have remained undetected as there are no test cases with
1-1 relationship with keyRestricted=false
Could form one test case showing the failure.  Please see if this is
the error you are getting and also explain for what setup you got the
exception.

CONFIG - 1-1 relationship with keyRestricted=false as below
------------

<Config xmlns="http:///org.apache.tuscany.das.rdb/config.xsd">
<Command name="get named employee with company"
   SQL="select * from EMPLOYEE left outer join COMPANY on EMPLOYEE.ID
= COMPANY.EOTMID where EMPLOYEE.NAME= ?" kind = "Select"/>

	<Table tableName="COMPANY">
    	<Column columnName="ID" primaryKey="true"/>
  	</Table>

  	<Table tableName="EMPLOYEE">
  	  	<Column columnName="ID" primaryKey="true"/>
  	</Table>	
	  	
	<Relationship name="company" primaryKeyTable="EMPLOYEE"
foreignKeyTable="COMPANY" many="false" keyRestricted="false">
      	   <KeyPair primaryKeyColumn="ID" foreignKeyColumn="EOTMID" />
  	</Relationship>
			
</Config>
--------------------------------------------------------------------------------------------------------------------------------
TEST CASE
------------------
    public void testNonRestrictedOneToOneRelationshipUpdate() throws Exception {
        DAS das =
DAS.FACTORY.createDAS(getConfig("OneToOneRestrictedConfig.xml"),
getConnection());

        Command read = das.getCommand("get named employee with company");
        read.setParameter(1, "Mary Smith");
        DataObject root = read.executeQuery();
        DataObject mary = root.getDataObject("EMPLOYEE[1]");

	//update parent and create child
        mary.setString("NAME", "maryNew");

        DataObject comp = root.createDataObject("COMPANY");
        comp.setInt("ID", 100);
        comp.setString("NAME", "comp100");
        mary.setDataObject("company", comp);

        try {
            das.applyChanges(root);
        } catch (RuntimeException ex) {
        	ex.printStackTrace();
        }

	//refresh to see the db data
        read.setParameter(1, "maryNew");
        root = read.executeQuery();
        mary = root.getDataObject("EMPLOYEE[1]");
        comp = mary.getDataObject("company");

        assertEquals(2, comp.getInt("EOTMID"));

    }
--------------------------------------------------------------------------------------------------------------------------------
Result:
-----------
Invalid foreign key column: EOTMID
	at org.apache.tuscany.das.rdb.generator.impl.UpdateGenerator.getChangedFields(UpdateGenerator.java:232)

Reason:
-----------
When doing update for EMPLOYEE, UpdateGenerator tries to find property
EOTMID in DO EMPLOYEE and fails to find it.

Solution:
------------
Check similar to InsertGenerator.hasState(), this fixes the issue.

Note:
---------
Trying other combinations of relationships like 1-n, 1-1 with
keyRestricted etc. as well as autogenerated PK effect for all the
cases.

Regards,
Amita

---------------------------------------------------------------------
To unsubscribe, e-mail: tuscany-user-unsubscribe@ws.apache.org
For additional commands, e-mail: tuscany-user-help@ws.apache.org