[英]Spring Data domain events go missing (?)
我在Spring Boot應用程序中從聚合根發布事件時遇到麻煩。 我基本上想要的是每次有關某個人的某些信息更改時都發布“更新”事件。 此代碼非常簡單:
@Entity
public class Person {
@Transient
private final Collection<AbstractPersonRelatedEvent> events = new ArrayList<>();
Person(Person other) {
// copy other fields
other.events.foreach(events::add);
}
// other stuff
public Person updateInformation(...) {
Person updated = new Person(this);
// setting new data on the updated person
if (!hasUpdateEventRegistered()) {
updated.registerEvent(PersonDataUpdatedEvent.forPerson(updated));
}
return updated;
}
void registerEvent(AbstractPersonRelatedEvent event) {
events.add(event);
}
@DomainEvents
Collection<AbstractPersonRelatedEvent> getModificationEvents() {
return Collections.unmodifiableCollection(events);
}
@AfterDomainEventPublication
void clearEvents() {
events.clear();
}
}
我正在通過經理來管理Person
實例:
@Service
@Transactional
class PersistentPersonManager implements PersonManager {
// other methods are omitted
@Override
public Person save(Person person) {
return personRepository.save(person);
}
}
但是,當我調用管理器( manager.save(person.updateInformation(...))
,事件似乎“丟失”了:調用save()
方法時,所有事件仍然存在,但是當Spring調用getModificationEvents()
,集合事件為空(僅執行Spring代碼)。
因為這是非常基本的,所以我必須錯過一些必不可少的東西,但會陷入困境。
那么如何在這里重回正軌?
我假設您在這里使用JPA。
對於JPA, save
操作實際上是在JPA EnityManager
上進行merge
。
對於分離的實體, merge
將從數據庫或當前會話中加載/查找具有相同ID的實體,然后復制所有(更改的)字段。 這確實會忽略瞬態字段,例如事件。
您正在處理分離的實體,因為每次調用updateInformation
時都在創建一個新實體。
所以這是正在發生的事情:
您從數據庫中加載實體( e1 )。 它沒有注冊任何事件。
通過調用updateInformation
您可以創建一個新的分離實體( e2 )。 您還可以向e2注冊事件。
調用save
JPA將找到匹配的e1並將所有更改從e2復制到其中,事件除外。 因此, e1仍未注冊任何事件。
事件被觸發,但是沒有任何事件,因為僅使用了e1 。
為了解決此問題:不要在updateInformation
創建實體的新實例。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.