Spring Data REST事件处理程序是否使用单独的数据库事务?

时间:2018-09-09 05:29:36

标签: spring spring-data-rest

Spring Data REST具有以下事件处理程序,它们会在HTTP请求(例如POST,PUT等)上触发。

@RepositoryEventHandler(Author.class) 
public class AuthorEventHandler {
    Logger logger = Logger.getLogger("Class AuthorEventHandler");

    @HandleBeforeCreate
    public void handleAuthorBeforeCreate(Author author){
        logger.info("Inside Author Before Create....");

    }

    @HandleAfterCreate
    public void handleAuthorAfterCreate(Author author){
        logger.info("Inside Author After Create ....");

    }

}

我的问题是,如果我访问@HandleBeforeCreate中的另一个数据库实体,例如Book,并对其进行修改,它会在单独的事务中发生还是会在与Author实体创建相同的事务中发生?

我已经检查过Spring Data REST文档,但此处未提及。

1 个答案:

答案 0 :(得分:1)

根据我的经验,这些处理程序是在主要事务之外执行的。从字面上看是“之前”和“之后”。关于“独立”交易-如果将事件处理程序标记为@Transactional,它将在其单独交易中执行。


从聚合根发布域事件

如果您需要在主事务中执行一些额外的操作,则可以使用publishing events from the aggregate root。在这种情况下,您应该从AbstractAggregateRoot扩展实体,并向其中添加一些注册适当事件的方法,例如:

@Entity
public class Model extends AbstractAggregateRoot {

   // entity stuff...

   public Model initExtraAction(SomeData payload) {
        registerEvent(new ExtraActionEvent(this, payload));
        return this;
   }
}

其中registerEventAbstractAggregateRoot方法,而ExtraActionEvent是您的自定义事件,如下所示:

@Value
public class ExtraActionEvent {
    private Model model;
    private SomeData payload;
}

然后您可以实现普通的事件处理程序

@Service
public class EventHandler {

    @EventListener
    @Transactional(propagation = MANDATORY) // optional 
    public void handleExtraActionEvent (ExtraActionEvent e) {
        Model model = e.getModel();
        SomeData payload = e.getPayload();

        // Extra actions...
    }
}

,如果您在调用{{1之前,在之前,调用了initExtendAction方法,将在与主交易相同的交易中与主交易进行调用。 }}的回购方法(为确保可以在同一笔交易中完成,您可以使用可选 save批注):

@Transactional(propagation = MANDATORY)

Spring Data REST 项目中,我们可以在创建或更新实体之前在'RepositoryEventHandler'中调用modelRepo.save(model.initExtraAction(payload)); 方法:

initExtraAction

您可以在Oliver Gierke Spring RestBucks演示项目中找到使用@RepositoryEventHandler(Model.class) public class ModelEventHandler { @HandleBeforeCreate @HandleBeforeSave public void handleBeforeCreateOrSave(Model model){ // Some manipulations... model.initExtraAction(...); } } 的完整示例。

其他信息:DDD Aggregates and @DomainEvents