簡體   English   中英

Spring Data Domain事件丟失(?)

[英]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時都在創建一個新實體。

所以這是正在發生的事情:

  1. 您從數據庫中加載實體( e1 )。 它沒有注冊任何事件。

  2. 通過調用updateInformation您可以創建一個新的分離實體( e2 )。 您還可以向e2注冊事件。

  3. 調用save JPA將找到匹配的e1並將所有更改從e2復制到其中,事件除外。 因此, e1仍未注冊任何事件。

  4. 事件被觸發,但是沒有任何事件,因為僅使用了e1

為了解決此問題:不要在updateInformation創建實體的新實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM