docs: public int update(DatabaseConnection databaseConnection, T data, ObjectCache objectCache) throws SQLException {
  		try {
  			// there is always and id field as an argument so just return 0 lines updated
  			if (argFieldTypes.length <= 1) {
  				return 0;
  			}
  			Object[] args = getFieldObjects(data);
  			Object newVersion = null;
  			if (versionFieldType != null) {
  				newVersion = versionFieldType.extractJavaFieldValue(data);
  				newVersion = versionFieldType.moveToNextValue(newVersion);
  				args[versionFieldTypeIndex] = versionFieldType.convertJavaFieldToSqlArgValue(newVersion);
  			}
  			int rowC = databaseConnection.update(statement, args, argFieldTypes);
  			if (rowC > 0) {
  				if (newVersion != null) {
  					// if we have updated a row then update the version field in our object to the new value
  					versionFieldType.assignField(connectionSource, data, newVersion, false, null);
  				}
  				if (objectCache != null) {
  					// if we've changed something then see if we need to update our cache
  					Object id = idField.extractJavaFieldValue(data);
  					T cachedData = objectCache.get(clazz, id);
  					if (cachedData != null && cachedData != data) {
  						// copy each field from the updated data into the cached object
  						for (FieldType fieldType : tableInfo.getFieldTypes()) {
  							if (fieldType != idField) {
  								fieldType.assignField(connectionSource, cachedData,
  										fieldType.extractJavaFieldValue(data), false, objectCache);
  							}
  						}
  					}
  				}
  			}
  			logger.debug("update data with statement '{}' and {} args, changed {} rows", statement, args.length, rowC);
  			if (args.length > 0) {
  				// need to do the (Object) cast to force args to be a single object
  				logger.trace("update arguments: {}", (Object) args);
  			}
  			return rowC;
  		} catch (SQLException e) {
  			throw SqlExceptionUtil.create("Unable to run update stmt on object " + data + ": " + statement, e);
  		}
  	}