The attached patch adds a "keyRestricted" attribute to the Relationship element in the DAS Config. This attribute is used to indicate that that a one to one relationship is a true one to one relationship, rather than a one to many relationship in the database that is treated as a 1-1 in the object model. If keyRestricted is true, updates to the relationship will not be allowed.
Brent
Index: src/test/java/org/apache/tuscany/das/rdb/test/OneToOneRelationshipTests.java =================================================================== --- src/test/java/org/apache/tuscany/das/rdb/test/OneToOneRelationshipTests.java (revision 425267) +++ src/test/java/org/apache/tuscany/das/rdb/test/OneToOneRelationshipTests.java (working copy) @@ -152,4 +152,31 @@ assertEquals("Joe Hotshot", employee.getString("NAME")); } + + public void testRestrictedOneToOneRelationship() 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]"); + DataObject company = mary.getDataObject("company"); + + DataObject bob = root.createDataObject("EMPLOYEE"); + bob.setString("NAME", "bob"); + bob.setString("SN", "E0005"); + bob.setInt("MANAGER", 0); + + bob.setDataObject("company", company); + + try { + das.applyChanges(root); + fail("Relationship modification should not be allowed."); + } catch (RuntimeException ex) { + assertEquals("Can not modify a one to one relationship that is key restricted", ex.getMessage()); + } + assertEquals("ACME Publishing", company.getString("NAME")); + + } } Index: src/test/resources/OneToOneRestrictedConfig.xml =================================================================== --- src/test/resources/OneToOneRestrictedConfig.xml (revision 0) +++ src/test/resources/OneToOneRestrictedConfig.xml (revision 0) @@ -0,0 +1,51 @@ +<?xml version="1.0" encoding="ASCII"?> +<!-- + Copyright (c) 2005 The Apache Software Foundation or its licensors, as applicable. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + --> +<Config xsi:noNamespaceSchemaLocation="http:///org.apache.tuscany.das.rdb/config.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + + <Command name="get all companies" SQL="select * from COMPANY" kind = "Select"/> + + <Command name="get named employee" SQL="select * from EMPLOYEE where NAME= ?" kind = "Select"/> + + <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"/> + + <Command name="get employee by ID" SQL="select * from EMPLOYEE where ID= ?" kind = "Select"/> + + <Command name="get all employees" SQL="select * from EMPLOYEE" kind = "Select"/> + + <Command name="get companies with employee of the month" + SQL="select * from COMPANY left outer join EMPLOYEE on COMPANY.EOTMID = EMPLOYEE.ID" kind="Select"/> + + + <Table tableName="COMPANY"> + <Column columnName="ID" primaryKey="true" generated="true"/> + </Table> + + <Table tableName="DEPARTMENT"> + <Column columnName="ID" primaryKey="true" generated="true"/> + </Table> + + <Table tableName="EMPLOYEE"> + <Column columnName="ID" primaryKey="true" generated="true"/> + </Table> + + <Relationship name="company" primaryKeyTable="EMPLOYEE" foreignKeyTable="COMPANY" many="false" keyRestricted="true"> + <KeyPair primaryKeyColumn="ID" foreignKeyColumn="EOTMID" /> + </Relationship> + +</Config> + Index: src/main/java/org/apache/tuscany/das/rdb/impl/ChangeSummarizer.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/impl/ChangeSummarizer.java (revision 425267) +++ src/main/java/org/apache/tuscany/das/rdb/impl/ChangeSummarizer.java (working copy) @@ -153,6 +153,8 @@ Relationship rel = mw.getRelationshipByReference(ref); if ( !rel.isMany()) { + if ( rel.isKeyRestricted()) + throw new RuntimeException("Can not modify a one to one relationship that is key restricted"); // This is a one-one relationship Table t = mapping.getTableByTypeName(changedObject.getType().getName()); TableWrapper tw = new TableWrapper(t); Index: src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java =================================================================== --- src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java (revision 425267) +++ src/main/java/org/apache/tuscany/das/rdb/impl/ChangeFactory.java (working copy) @@ -76,9 +76,6 @@ return new CreateOperation(getCreateCommand(changedObject), changedObject, propagatedID); } - ChangeOperation createInsertOperation(DataObject changedObject) { - return createInsertOperation(changedObject, null); - } private InsertCommandImpl getCreateCommand(DataObject changedObject) { Index: src/main/resources/config.xsd =================================================================== --- src/main/resources/config.xsd (revision 425267) +++ src/main/resources/config.xsd (working copy) @@ -63,6 +63,7 @@ <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="Table"> <xsd:sequence>
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]