域事件仅在保存之前发布

时间:2017-09-28 21:08:16

标签: spring-data spring-data-jpa

我有一个像这样的聚合根:

public class Room extends AbstractAggregateRoot implements Serializable {
  // lots of code
  @OneToMany(mappedBy = "room", cascade = {CascadeType.MERGE, CascadeType.PERSIST,
      CascadeType.REMOVE})
  private List<Message> messages = new ArrayList<>();

  public void sendMessage(Message message) {
    message.setRoom(this);
    messages.add(message);
    registerEvent(new MessageSavedEvent((message)));
  }
}

我正在创建这样的消息:

Room room = roomRepository.findByUid(uid);
room.sendMessage(MessageFactory.createMessage(params.getContent(), sender));
roomRepository.save(room);

事情是事件正在发布之前保存消息,因此在我的消息保存处理程序中,id和createdAt之类的其他内容为空。我知道我可以通过ApplicationContext手动发布事件,但我会违反DDD而不是从聚合器发布事件。还有什么我能做的吗?

1 个答案:

答案 0 :(得分:1)

Spring Data并未提供开箱即用的支持。但JPA发布了持续性事件:http://www.objectdb.com/java/jpa/persistence/event

所以我猜你能做的就是为它写一个监听器,触发事件的发布。

一个挑战是JPA可能会替换您的实例,而且它不会复制字段而不会保留。一旦post-persist事件触发,这可能会导致您的消息消失。因此,您可能希望使用现有基础结构在独立于聚合根的某个位置存储消息,然后在之后发布它们。