在自定义方面调用之前提交Spring @Transactional

时间:2017-08-09 08:50:42

标签: java spring transactions spring-aop

服务层上的方法有2个注释。 Spring @Transactional和我的自定义@GenerateEmail,这是加入点以启动@AfterReturning建议。

@Transactional
@GenerateEmail
public Long createEntity(CustomEntity entity){
    ...
}

有一个建议:

@AfterReturning(value = "@annotation(generation)", returning = "id")
public void generateEmail(GenerateEmail generation, Long id) {
    processMailing(generation, id);
}

还有一些问题,原因是建议订单调用。邮件生成后正在调用提交@Transactional

首先,我无法访问未提交的数据。如果我通过其{id} CustomEntity字段持久存储@ManyToOne,则Hibernate仅在提交事务后才会获取其余数据。

generateEmail抛出RuntimeException时,会出现第二个问题。它正在回滚createEntity交易,我不想这样做。

@Order(2)上的generateEmail注释正在解决问题,但我对此并不确定。这对于破解建议订单似乎不是一个好习惯。

我还可以将我的自定义@GenerateEmail注释上移到上层控制器层,其中事务已经提交,但我更喜欢将它放在服务层上。

我可以在generateEmail之前提交交易吗?这是解决这个问题的好方法吗?或者是以错过的方式解决这个问题?

1 个答案:

答案 0 :(得分:0)

你可以这样解决:

@GenerateEmail
public Long createEntity(CustomEntity entity){
    doCreateEntity(entity);
}

@Transactional
private Long doCreateEntity(CustomEntity entity){
    ...
}

在服务层上使用这两种方法。 createEntity可以确保在执行@GenerateEmail时提交事务。

警告:这仅在您将AOP用于事务时才有效,因为代理不会对私有方法调用进行事务处理。