我有一个像这样的聚合根:
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而不是从聚合器发布事件。还有什么我能做的吗?
答案 0 :(得分:1)
Spring Data并未提供开箱即用的支持。但JPA发布了持续性事件:http://www.objectdb.com/java/jpa/persistence/event
所以我猜你能做的就是为它写一个监听器,触发事件的发布。
一个挑战是JPA可能会替换您的实例,而且它不会复制字段而不会保留。一旦post-persist事件触发,这可能会导致您的消息消失。因此,您可能希望使用现有基础结构在独立于聚合根的某个位置存储消息,然后在之后发布它们。