使用 spring-data-jdbc 进行审计?

问题描述 投票:0回答:1

我已经看到上一个问题的回复了! ,但这并没有解决我的问题。

我跟踪了spring-data-jdbc的代码,发现只要自定义了

BeforeSaveEvent
事件,并且在这个事件中设置了自定义的ID,那么自定义事件执行完之后,就会继续触发
RelationalAuditingEventListener#onApplicationEvent的执行
在已设置为 ID 的实体上。做出
isNew
决定,ieNew=false。

// IsNewAwareAuditingHandler#markAudited
// Triggers the markModified method.
entity.isNew(object) ? markCreated(object) : markModified(object);

聚合根和实体有什么区别?如何设计一个在使用第一次保存时可以用

@CreatedDate
@CreatedBy
保存的实现?
@LastModifiedDate
@LastModifyBy

java spring aggregateroot auditing spring-data-jdbc
1个回答
1
投票

你所描述的对我来说听起来像是一个错误。 如果您在事件侦听器中设置 id,它仍应作为新实例进行处理。 请在 https://jira.spring.io/browse/DATAJDBC

提交问题

如何设计一个在使用第一次保存时可以使用@CreatedDate和@CreatedBy进行保存的实现? @LastModifiedDate 和 @LastModifyBy?

作为解决方法,您可以将

IsNewAwareAuditingHandler
与事件处理程序结合起来以设置 id。

聚合根和实体有什么区别?

entity 是由其 id 标识的对象,请注意 id 可能是隐式的。 见下文。

聚合是属于在一起并在单个事务中持久化的对象(通常很小)集群。 例如,

PurchaseOrder
和它的
LineItem
都是属于同一聚合的实体。 单个对象完全有可能成为它自己的聚合体。

聚合根是聚合中的一个实体。 与聚合成员的所有交互都应该通过聚合根。 这允许聚合根控制一致性。 例如,在上面给出的示例中,

PurchaseOrder
将是聚合根。 因此,您不会有一个
getItems()
getter 返回项目的生命集合。相反,您可能会
addItem(productId, amount)
getItems()
会返回项目的副本,因此更改这些项目不会影响聚合。

Martin Fowlers 定义:https://www.martinfowler.com/bliki/DDD_Aggregate.html

Vaughn Vernon 关于聚合的精彩文章:

https://dddcommunity.org/wp-content/uploads/files/pdf_articles/Vernon_2011_1.pdf

https://dddcommunity.org/wp-content/uploads/files/pdf_articles/Vernon_2011_2.pdf

https://dddcommunity.org/wp-content/uploads/files/pdf_articles/Vernon_2011_3.pdf

© www.soinside.com 2019 - 2024. All rights reserved.