@Override
    public void doSave(IProgressMonitor monitor)
    {
        if (!isDirty()) {
            return;
        }
        if (EditorUtils.isInAutoSaveJob()) {
            // Do not save entity editors in auto-save job (#2408)
            return;
        }
        DBPProject ownerProject = getEditorInput().getNavigatorNode().getOwnerProject();

        if (
            DBUtils.isReadOnly(getDatabaseObject())
                || ownerProject == null
                || !DBWorkbench.getPlatform().getWorkspace().hasRealmPermission(RMConstants.PERMISSION_METADATA_EDITOR)
        ) {
            DBWorkbench.getPlatformUI().showNotification(
                "Read-only",
                "Object [" + DBUtils.getObjectFullName(getDatabaseObject(), DBPEvaluationContext.UI) + "] is read-only",
                true, null);
            return;
        }

        // Flush all nested object editors and result containers
        for (IEditorPart editor : editorMap.values()) {
            if (editor instanceof IEntityStructureEditor || editor instanceof IEntityDataEditor) {
                if (editor.isDirty()) {
                    editor.doSave(monitor);
                }
            }
            if (monitor.isCanceled()) {
                return;
            }
        }

        // Check read-only

        // Show preview
        int previewResult = IDialogConstants.PROCEED_ID;
        if (DBWorkbench.getPlatform().getPreferenceStore().getBoolean(NavigatorPreferences.NAVIGATOR_SHOW_SQL_PREVIEW)) {
            monitor.beginTask(UINavigatorMessages.editors_entity_monitor_preview_changes, 1);
            previewResult = showChanges(true);
            monitor.done();
        }

        if (previewResult == IDialogConstants.IGNORE_ID) {
            // There are no changes to save
            // Let's just refresh dirty status
            firePropertyChange(IEditorPart.PROP_DIRTY);
            return;
        }
        if (previewResult != IDialogConstants.PROCEED_ID) {
            monitor.setCanceled(true);
            return;
        }

        try {
            saveInProgress = true;

            monitor.beginTask("Save changes...", 1);
            try {
                monitor.subTask("Save '" + getPartName() + "' changes...");
                SaveJob saveJob = new SaveJob();
                saveJob.schedule();

                // Wait until job finished
                UIUtils.waitJobCompletion(saveJob, monitor);
                if (!saveJob.success) {
                    monitor.setCanceled(true);
                    return;
                }
            } finally {
                monitor.done();
            }

            firePropertyChange(IEditorPart.PROP_DIRTY);
        }
        finally {
            saveInProgress = false;
        }

        // Run post-save commands (e.g. compile)
        Map<String, Object> context = new LinkedHashMap<>();
        for (IEditorPart editor : editorMap.values()) {
            if (editor instanceof IDatabasePostSaveProcessor) {
                ((IDatabasePostSaveProcessor) editor).runPostSaveCommands(context);
            }
            if (monitor.isCanceled()) {
                return;
            }
        }
    }
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