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); } } } }