public void getChange(
      Record row,
      DatabaseMapping mapping,
      Session session,
      Object object1,
      Object object2,
      boolean useUOW,
      WriteType writeType) {
    if (mapping.isAggregateObjectMapping()) {
      Object aggregate1 = mapping.getAttributeValueFromObject(object1);
      Object aggregate2 = mapping.getAttributeValueFromObject(object2);
      if (aggregate1 == null && aggregate2 == null) {
        if (!useUOW) {
          mapping.writeFromObjectIntoRow(
              object2, (DatabaseRecord) row, (AbstractSession) session, writeType);
        }
      } else if (aggregate1 != null
          && aggregate2 != null
          && aggregate1.getClass().equals(aggregate2.getClass())) {
        ClassDescriptor desc = ((AggregateObjectMapping) mapping).getReferenceDescriptor();
        getChange(row, session, aggregate1, aggregate2, desc, useUOW, writeType);
      } else {
        mapping.writeFromObjectIntoRow(
            object2, (DatabaseRecord) row, (AbstractSession) session, writeType);
      }
    } else {
      Record row1 = new DatabaseRecord();
      Record row2 = new DatabaseRecord();
      mapping.writeFromObjectIntoRow(
          object1, (DatabaseRecord) row1, (AbstractSession) session, writeType);
      mapping.writeFromObjectIntoRow(
          object2, (DatabaseRecord) row2, (AbstractSession) session, writeType);

      for (int i = 0; i < row1.size(); i++) {
        DatabaseField field = (DatabaseField) ((DatabaseRecord) row1).getFields().elementAt(i);
        Object valueBefore = ((DatabaseRecord) row1).getValues().elementAt(i);
        Object valueAfter = row2.get(field);
        boolean changed;
        if (valueAfter == null) {
          changed = valueBefore != null;
        } else {
          changed = !valueAfter.equals(valueBefore);
        }
        if (changed) {
          row.put(field, valueAfter);
        }
      }
    }
  }