Spring @Transactional Удалить и создать в той же транзакции - PullRequest
0 голосов
/ 27 сентября 2019

Я пишу Angular + Spring Web-приложение с некоторыми базовыми функциями редактора.В моем бэкэнде я уже создал функционал для обработки черновиков.Таким образом, в основном пользователь сначала создает черновик, редактирует материал, сохраняет черновик и публикует его, когда он закончит свою работу.Поэтому в своем «бизнес-уровне» я создал интерфейс DraftManagement, где все открытые методы в реализации помечены @Transactional:

public interface DraftManagement {

    DraftCto findDraft(...);

    DraftCto createDraft(...);

    void deleteDraft(...);

    void publishDraft(...);

Пока все хорошо.Все работает как положено.Но теперь у меня есть новое требование для загрузки текстов из файла .properties.Поэтому я подумал, что смогу повторно использовать существующую черновую функциональность.Шаги будут включать:

  1. Удалить существующий черновик, если таковой имеется (допускается только один черновик для каждого документа)
  2. создать новый черновик
  3. Сохранить тексты.файл свойств для черновика
  4. опубликовать черновик

Я хочу, чтобы это выполнялось в транзакции, охватывающей все вышеперечисленные шаги, поэтому я создал метод в отдельном классе вариантов использования:

public class UcUploadProperties {

    @Inject
    private DraftManagement draftManagement;

    @Transactional
    @Override
    public void uploadProperties(...) {
        ...
        final DraftCto existingDraft = this.draftManagement.findDraft(...);
        if (Objects.nonNull(existingDraft)){
            this.draftManagement.deleteDraft(...);
        }
        DraftCto freshDraft = this.draftManagement.createDraft(...);
        ...
        this.draftManagement.saveText(...);
        this.draftManagement.publishDraft(...);
    }

Теперь у меня есть две проблемы:

  1. , если черновик существует заранее, он не будет удален перед операцией создания, поскольку удаление не зафиксировано.Даже repository.flush () после операции удаления не работает.
  2. , если предварительно не существует черновика и я получаю доступ к полям созданного объекта черновика, например, в методе публикации (draftEntity.getXyz (). GetAbc ())только идентификатор (первичный ключ) первого уровня связанных полей может быть разрешен.Остальное равно нулю, даже если я сохранил черновик с помощью saveAndFlush ()

Если я удаляю @Transactional в методе uploadProperties, код работает должным образом, но не в глобальной транзакции.Поэтому я хочу попросить совета о том, как обрабатывать такие сценарии использования, когда эквивалентный объект необходимо удалить и заново создать в той же транзакции?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...