private boolean saveCommandContext(final DBRProgressMonitor monitor, Map<String, Object> options) {
        monitor.beginTask("Save entity", 1);
        Throwable error = null;
        final DBECommandContext commandContext = getCommandContext();
        if (commandContext == null) {
            log.warn("Null command context");
            return true;
        }
        DBCExecutionContext executionContext = getExecutionContext();
        if (executionContext == null) {
            log.warn("Null execution context");
            return true;
        }
        boolean isNewObject = getDatabaseObject() == null || !getDatabaseObject().isPersisted();
        if (!isNewObject) {
            // Check for any new nested objects
            for (DBECommand cmd : commandContext.getFinalCommands()) {
                if (cmd.getObject() instanceof DBSObject && !((DBSObject) cmd.getObject()).isPersisted()) {
                    isNewObject = true;
                    break;
                }
            }
        }
        try {
            DBExecUtils.tryExecuteRecover(monitor, executionContext.getDataSource(), param -> {
                try {
                    commandContext.saveChanges(monitor, options);
                } catch (DBException e) {
                    throw new InvocationTargetException(e);
                }
            });
        } catch (DBException e) {
            error = e;
        }
        if (getDatabaseObject() instanceof DBPStatefulObject) {
            try {
                ((DBPStatefulObject) getDatabaseObject()).refreshObjectState(monitor);
            } catch (DBCException e) {
                // Just report an error
                log.error(e);
            }
        }

        if (error == null) {
            // Refresh underlying node
            // It'll refresh database object and all it's descendants
            // So we'll get actual data from database
            final DBNDatabaseNode treeNode = getEditorInput().getNavigatorNode();
            boolean doRefresh = isNewObject;
            new AbstractJob("Database node refresh") { //$NON-NLS-1$
                @Override
                protected IStatus run(DBRProgressMonitor monitor) {
                    try {
                        treeNode.refreshNode(monitor, doRefresh ? DBNEvent.FORCE_REFRESH : DBNEvent.UPDATE_ON_SAVE);
                    } catch (DBException e) {
                        return GeneralUtils.makeExceptionStatus(e);
                    }
                    return Status.OK_STATUS;
                }
            }.schedule();
        }
        monitor.done();

        if (error == null) {
            return true;
        } else {
            // Try to handle error in nested editors
            final Throwable vError = error;
            UIUtils.syncExec(() -> {
                final IErrorVisualizer errorVisualizer = getAdapter(IErrorVisualizer.class);
                if (errorVisualizer != null) {
                    errorVisualizer.visualizeError(monitor, vError);
                }
            });

            // Show error dialog

            UIUtils.asyncExec(() ->
                DBWorkbench.getPlatformUI().showError("Can't save '" + getDatabaseObject().getName() + "'", null, vError));
            return false;
        }
    }
Saves data in all nested editors
@param monitor progress monitor
plugins/org.jkiss.dbeaver.ui.navigator/src/org/jkiss/dbeaver/ui/editors/entity/EntityEditor.java