@Override
    public void setValueAt(Object newValue, int row, int column) {
        if (!linkable) {
            return;
        }
        final Object oldValue = getValueAt(row, column);
        final boolean changed;
        if (newValue == null) {
            changed = (newValue != oldValue);
        } else {
            changed = !newValue.equals(oldValue);
        }
        if (changed) {
            if (isLinkedRow(row)) {
                Object[] keys = columnIdentifiers.toArray();
                try {
                    executeUpdate(getRowData(keys, row), keys[column], newValue);
                } catch (Exception ex) {
                    log.error(ex);
                    throw new RuntimeException(ex);
                }
            } else {
                if (log.isTraceEnabled()) {
                    log.debug("update unlinked row");
                }
            }
        } else {
            if (log.isDebugEnabled()) {
                log.debug("skip to update");
            }
        }
        super.setValueAt(newValue, row, column);
    }