Я пишу Angular + Spring Web-приложение с некоторыми базовыми функциями редактора.В моем бэкэнде я уже создал функционал для обработки черновиков.Таким образом, в основном пользователь сначала создает черновик, редактирует материал, сохраняет черновик и публикует его, когда он закончит свою работу.Поэтому в своем «бизнес-уровне» я создал интерфейс DraftManagement, где все открытые методы в реализации помечены @Transactional:
public interface DraftManagement {
DraftCto findDraft(...);
DraftCto createDraft(...);
void deleteDraft(...);
void publishDraft(...);
Пока все хорошо.Все работает как положено.Но теперь у меня есть новое требование для загрузки текстов из файла .properties.Поэтому я подумал, что смогу повторно использовать существующую черновую функциональность.Шаги будут включать:
- Удалить существующий черновик, если таковой имеется (допускается только один черновик для каждого документа)
- создать новый черновик
- Сохранить тексты.файл свойств для черновика
- опубликовать черновик
Я хочу, чтобы это выполнялось в транзакции, охватывающей все вышеперечисленные шаги, поэтому я создал метод в отдельном классе вариантов использования:
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(...);
}
Теперь у меня есть две проблемы:
- , если черновик существует заранее, он не будет удален перед операцией создания, поскольку удаление не зафиксировано.Даже repository.flush () после операции удаления не работает.
- , если предварительно не существует черновика и я получаю доступ к полям созданного объекта черновика, например, в методе публикации (draftEntity.getXyz (). GetAbc ())только идентификатор (первичный ключ) первого уровня связанных полей может быть разрешен.Остальное равно нулю, даже если я сохранил черновик с помощью saveAndFlush ()
Если я удаляю @Transactional в методе uploadProperties, код работает должным образом, но не в глобальной транзакции.Поэтому я хочу попросить совета о том, как обрабатывать такие сценарии использования, когда эквивалентный объект необходимо удалить и заново создать в той же транзакции?