当前位置: 首页 > 知识库问答 >
问题:

Spring数据域事件丢失(?)

夹谷茂
2023-03-14

我在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(manager.save(Person.updateInformation(...))时,事件似乎“丢失”了:在调用save()方法时,所有事件仍然存在,但是当Spring调用getModificationEvents()时,集合是空的。

那么我怎么才能回到正轨呢?

共有1个答案

牛昱
2023-03-14

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

对于JPA,save操作实际上对JPAenityManager执行合并

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

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

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

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

 类似资料:
  • 我想使用SLF4J-extEventData和EventLogger来记录我的业务逻辑中的重要事件: 我还想使用log4j2作为后端。目前,这导致以下工件成为我部署的一部分:slf4j-api-1.7。12,slf4j-ext-1.7。12、log4j-api-2.3、log4j-core-2.3、log4j-slf4j-impl-2.3、log4j-web-2.3——当然还有它们的依赖关系。 我

  • 我正在使用和使用。 既然是一个并且没有模式验证,那么和存储在MongoDB中的Document类是两个不同的类,在将数据读写到时在这两个类之间转换内容。 由于根实体类与存储到DB的类不同,所以Spring不会触发的。 > 在将数据存储到数据库后,有没有一种方法可以从存储库中触发根实体的事件?(可能通过显式调用) 因为MongoDB和聚合是1:1匹配。那么,这是否意味着我们通常不应该创建两个不同的类

  • 我对使用PrimeFaces 3.4.1和JSF 2.1.6的dataTable有以下问题。第一次加载页面时,数据表中充满了数据库中的数据,但每当在页面上执行操作(编辑链接、数据表排序或过滤)时,数据表就会丢失其数据。DataTable包含来自此类的元素: 在dataTable上执行操作后进行调试时,我们只在envioDatasujeto字段上保留数据,元素上的其他所有数据都会丢失。 这是xhtm

  • COVID COVID-19-网易 接口: covid_19_163 目标地址: https://news.163.com/special/epidemic/ 描述: 获取网易-新型冠状病毒肺炎-疫情数据 限量: 单次返回指定 indicator 的数据 输入参数-数据说明 名称 类型 必选 描述 indicator str Y indicator="数据说明"; 返回网易对相关字段的数据说明 输

  • 3.6 ABP领域层 - 领域事件 在C#中,一个类可以定义其专属的事件并且其它类可以注册该事件并监听,当事件被触发时可以获得事件通知。这对于对于桌面应用程序或独立的Windows Service来说非常有用。但是, 对于Web应用程序来说会有点问题,因为对象是根据请求(request)被创建并且它们的生命周期都很短暂。我们很难注册其它类别的事件。同样地,直接注册其它类别的事件也造成了类之间的耦合

  • 我正在使用spring数据jpa为我的服务实现多事务(数据库),带有两个持久的单元名。并在Jboss 6.4 EAP中部署 以下是我的服务详情 在Jboss中,我无法部署它,我遇到以下异常: 原因:org.springframework.beans.factory.BeanCreationException:无法自动装配字段:私有com.test.demo.domain.repository.Tb