猿问

更新时,不会在返回的实体上设置标记为 updatable=false 的 spring 数据审计字段

我正在使用 Spring Data 的注释在保存或更新实体时将审计数据添加到我的实体中。当我创建实体时createdBy,createdDate,lastModifiedBy和lastModifiedDateget 设置在由 返回的对象上repository.save()。


ResourceEntity(id=ebbe1f3d-3359-4295-8c83-63eab21c4753, createdDate=2018-09-07T21:11:25.797, lastModifiedDate=2018-09-07T21:11:25.797, createdBy=5855070b-866f-4bc4-a18f-26b54f896a4b, lastModifiedBy=5855070b-866f-4bc4-a18f-26b54f896a4b)

不幸的是,当我调用repository.save()更新现有实体时,返回的对象没有createdBy和createdDate设置。


 ResourceEntity(id=ebbe1f3d-3359-4295-8c83-63eab21c4753, createdDate=null, lastModifiedDate=2018-09-07T21:12:01.953, createdBy=null, lastModifiedBy=5855070b-866f-4bc4-a18f-26b54f896a4b)

所有字段都在数据库中正确设置,repository.findOne()对我的服务类外部的调用返回一个所有字段设置正确的对象。


ResourceEntity(id=ebbe1f3d-3359-4295-8c83-63eab21c4753, createdDate=2018-09-07T21:11:25.797, lastModifiedDate=2018-09-07T21:12:01.953, createdBy=5855070b-866f-4bc4-a18f-26b54f896a4b, lastModifiedBy=5855070b-866f-4bc4-a18f-26b54f896a4b)

但是,如果我repository.findOne()在调用repository.save()更新实体后立即调用服务,我也会返回一个对象createdBy并将其createdDate设置为 null。


这是我的实体:


@Entity(name = "resource")

@EntityListeners(AuditingEntityListener.class)

@Table(name = "resource")

@Data

@EqualsAndHashCode(of = "id")

@Builder

@AllArgsConstructor

@NoArgsConstructor(access = AccessLevel.PRIVATE)

public class ResourceEntity {


@Id

@org.hibernate.annotations.Type(type = "org.hibernate.type.PostgresUUIDType")

private UUID id;


@CreatedDate

@Column(nullable = false, updatable = false)

private LocalDateTime createdDate;


@LastModifiedDate

private LocalDateTime lastModifiedDate;


@CreatedBy

@Column(nullable = false, updatable = false)

@org.hibernate.annotations.Type(type = "org.hibernate.type.PostgresUUIDType")

private UUID createdBy;


@LastModifiedBy

@org.hibernate.annotations.Type(type = "org.hibernate.type.PostgresUUIDType")

private UUID lastModifiedBy;

}


慕森卡
浏览 254回答 2
2回答

一只萌萌小番薯

在最初的问题多年之后,它仍然是一个问题。虽然不是一个完美的解决方案,但我最终获取(通过findById())现有实体并在执行更新之前手动设置新实体上的@CreatedBy和@CreatedDate字段。JPA 的审计框架没有自动处理这个问题或提供更好的方法来完成它,这既令人惊讶又令人沮丧。

慕桂英546537

当我需要添加审计信息时,我以前尝试过这样。我有一DataConfig堂这样的课。@Configuration@EnableJpaAuditingpublic class DataConfig {&nbsp; &nbsp; @Bean&nbsp; &nbsp; public AuditorAware<UUID> auditorProvider() {&nbsp; &nbsp; &nbsp; &nbsp; return new YourSecurityAuditAware();&nbsp; &nbsp; }&nbsp; &nbsp; @Bean&nbsp; &nbsp; public DateTimeProvider dateTimeProvider() {&nbsp; &nbsp; &nbsp; &nbsp; return () -> Optional.of(Instant.from(ZonedDateTime.now()));&nbsp; &nbsp; }}现在你需要AuditorAware类来获取审计信息。所以这个类会是这样的;public class XPorterSecurityAuditAware implements AuditorAware<UUID> {&nbsp; &nbsp; @Override&nbsp; &nbsp; public Optional<UUID> getCurrentAuditor() {&nbsp; &nbsp; &nbsp; &nbsp; //you can change UUID format as well&nbsp; &nbsp; &nbsp; &nbsp; return Optional.of(UUID.randomUUID());&nbsp; &nbsp; }}希望这会帮助你。
随时随地看视频慕课网APP

相关分类

Java
我要回答