服务层上的方法有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
之前提交交易吗?这是解决这个问题的好方法吗?或者是以错过的方式解决这个问题?
答案 0 :(得分:0)
你可以这样解决:
@GenerateEmail public Long createEntity(CustomEntity entity){ doCreateEntity(entity); } @Transactional private Long doCreateEntity(CustomEntity entity){ ... }
在服务层上使用这两种方法。 createEntity可以确保在执行@GenerateEmail时提交事务。
警告:这仅在您将AOP用于事务时才有效,因为代理不会对私有方法调用进行事务处理。