【问题标题】:Spring Data domain events go missing (?)Spring Data 域事件丢失(?)
【发布时间】:2017-12-30 16:34:39
【问题描述】:

我在从 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 代码)。

因为这是非常基本的,所以我一定是错过了一些重要的东西,但却陷入了困境。

那么我该如何回到正轨呢?

【问题讨论】:

    标签: java spring jpa events spring-data


    【解决方案1】:

    我假设您在这里使用的是 JPA。

    对于 JPA,save 操作实际上在 JPA EnityManager 上执行 merge

    对于分离的实体merge,从数据库或当前会话中加载/查找具有相同 ID 的实体,并复制所有(更改的)字段。这确实会忽略事件等瞬态字段。

    您正在处理分离的实体,因为您每次调用 updateInformation 时都会创建一个新实体。

    这就是正在发生的事情:

    1. 您从数据库中加载了一个实体 (e1)。它没有注册任何事件。

    2. 通过调用 updateInformation,您可以创建一个新的分离实体 (e2)。您还可以使用 e2 注册事件。

    3. 当调用save时,JPA 找到匹配的 e1 并将 e2 中的所有更改复制到其中,但事件除外。所以 e1 仍然没有注册任何事件。

    4. 事件被触发,但没有任何事件,因为只使用了 e1

    为了解决这个问题:不要在updateInformation 中创建实体的新实例。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 2010-12-15
      • 2015-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多