我在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()
时,集合是空的。
那么我怎么才能回到正轨呢?
我假设您在这里使用的是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