Spring @Transactional在同一事务中删除和创建

时间:2019-09-27 08:51:45

标签: java spring hibernate jpa spring-data-jpa

我编写了具有一些基本编辑器功能的Angular + Spring Web应用程序。在后端,我已经创建了用于处理草稿的功能。因此,基本上,用户在完成工作后首先创建草稿,编辑内容,保存草稿并将其发布。因此,在我的“业务”层中,我创建了一个接口DraftManagement,其中在实现中的所有公共方法都用@Transactional注解:

public interface DraftManagement {

    DraftCto findDraft(...);

    DraftCto createDraft(...);

    void deleteDraft(...);

    void publishDraft(...);

到目前为止,一切都很好。一切正常。但是现在我有了从.properties文件上载文本的新要求。所以我想我可以重用现有的草案功能。步骤将包括:

  1. 删除现有草稿(如果有,请删除一个草稿)
  2. 创建新草稿
  3. 将.properties文件的文本保存到草稿中
  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. 如果事先没有草稿,并且我访问createdDraft Entity的字段,例如在publish方法(draftEntity.getXyz()。getAbc())中,只能解析第一级相关字段的ID(主键)。即使我使用saveAndFlush()保留了草稿,其余的也为null

如果我在uploadProperties方法上删除@Transactional,则代码将按预期运行,但不会在全局事务中运行。因此,我想征询有关如何处理此类用例的建议,在这种情况下,必须删除同一对象并在同一事务中重新创建该对象?

0 个答案:

没有答案