Hi, trying to do an insert of a datagraph using ApplyChanges, i noticed that
foreign keys was not being updated, after some debugging I could see that
the problem was in the class InsertGenerator:

   public InsertCommandImpl getInsertCommand(MappingWrapper config,
DataObject changedObject, Table t) {
        List parameters = new ArrayList();
        TableWrapper table = new TableWrapper(t);
        StringBuffer statement = new StringBuffer("insert into ");
        //JIRA-952
        if(config.getConfig().isDatabaseSchemaNameSupported()){
            statement.append(t.getSchemaName()+"."+t.getTableName());
        }
        else{
        statement.append(t.getTableName());
        }
        HashSet changedProperties = getAttributeProperties(changedObject,
config, table);
        Iterator i;
        if ( changedProperties.isEmpty() ) {
            i = changedObject.getType().getProperties().iterator();
        } else {
            i = changedProperties.iterator();
        }

        List attributes = new ArrayList();
        List generatedKeys = new ArrayList();
*        while (i.hasNext()) {
            Property attr = (Property) i.next();
            if ( attr.getType().isDataType()) {
                if (table.isGeneratedColumnProperty(attr.getName())) {
                 generatedKeys.add(attr.getName());
             } else {
                 attributes.add(attr.getName());

parameters.add(changedObject.getType().getProperty(attr.getName()));
             }
            }
        }
*
        statement.append("(");
        Iterator attrs = attributes.iterator();
        while (attrs.hasNext()) {
            String name = (String) attrs.next();
            statement.append("");
            Column c = config.getColumnByPropertyName(t, name);
            statement.append(c == null ? name : c.getColumnName());
            if (attrs.hasNext()) {
                statement.append(", ");
            } else {
                statement.append(")");
            }
        }

        statement.append(" values (");
        for (int idx = 1; idx <= attributes.size(); idx++) {
            statement.append('?');
            if (idx < attributes.size()) {
                statement.append(", ");
            } else {
                statement.append(")");
            }
        }

        InsertCommandImpl cmd = new InsertCommandImpl(statement.toString(),
                (String[]) generatedKeys.toArray(new String[0]));
        Iterator params = parameters.iterator();
        for (int idx = 1; params.hasNext(); idx++) {
            Property property = (Property) params.next();
            ParameterExtendedImpl p = new ParameterExtendedImpl();
            p.setName(property.getName());
            p.setType(property.getType());

p.setColumnType(SDODataTypeHelper.columnTypeForSDOType(property.getType()));

p.setConverter(getConverter(table.getConverter(property.getName())));
            p.setIndex(idx);
            cmd.addParameter(p);

        }
        if (this.logger.isDebugEnabled()) {
            this.logger.debug(statement.toString());
        }

        return cmd;

    }


The code generates a parameter in the insert sentence only when the property
is DataType, so child objects are not considered and the resulting insert
misses the corresponding parameters,  is this the intended behavior or is a
bug?,   i also noticed a strange identation that makes me guess there is a
wrong placed bracket.


I'm using DAS Code from the subversion repository.

Thanks a lot

Reply via email to