为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森卡 2021-09-03 22:05:35
我正在使用 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;@LastModifiedDateprivate 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;}
查看完整描述

2 回答

?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

在最初的问题多年之后,它仍然是一个问题。

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


查看完整回答
反对 回复 2021-09-03
?
慕桂英546537

TA贡献1848条经验 获得超10个赞

当我需要添加审计信息时,我以前尝试过这样。


我有一DataConfig堂这样的课。


@Configuration

@EnableJpaAuditing

public class DataConfig {


    @Bean

    public AuditorAware<UUID> auditorProvider() {

        return new YourSecurityAuditAware();

    }


    @Bean

    public DateTimeProvider dateTimeProvider() {

        return () -> Optional.of(Instant.from(ZonedDateTime.now()));

    }

}

现在你需要AuditorAware类来获取审计信息。所以这个类会是这样的;


public class XPorterSecurityAuditAware implements AuditorAware<UUID> {


    @Override

    public Optional<UUID> getCurrentAuditor() {

        //you can change UUID format as well

        return Optional.of(UUID.randomUUID());

    }

}

希望这会帮助你。


查看完整回答
反对 回复 2021-09-03
  • 2 回答
  • 0 关注
  • 253 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信