spring data jpa细粒度审计,自定义审计

1 auditing spring-data-jpa

我需要在同一个表中插入用户所属的用户名和组名(均在 SecurityContext 中可用)。

class Entity

{ 

   @createdBy 
   String username 

   @createdBy 
   String groupname 

   other fields ...

}
Run Code Online (Sandbox Code Playgroud)

根据要求。我无法通过创建用户类并通过外键引用它来解决这个问题。

使用 AuditingHandler 的当前实现,两个字段都获得相同的值。我如何确保它们获得各自的值。

这可以使用当前的实现来实现吗?如果不是,我如何提供 AuditingHandler 的自定义实现?

J R*_*J R 5

您可以创建一个单独的可嵌入类,并在父类中使用 @CreatedBy 对其进行注释。一种方法是定义一个实现 AuditorAware 的 bean,然后您可以使其返回自定义对象,其中包含您的两个必需字段。例如,您的父类将如下所示(注意侦听器注释):

@Entity
@EntityListeners(AuditingEntityListener.class)
public class AuditedEntity {

    @Id
    @GeneratedValue(generator = "uuid")
    @GenericGenerator(name = "uuid", strategy = "uuid")
    private String id;

    @Embedded
    @CreatedBy
    private AuditorDetails createdBy;

    // setters and getters
}
Run Code Online (Sandbox Code Playgroud)

其中 AuditorDetails 是:

@Embeddable
public class AuditorDetails {
    private String username;
    private String groupname;

    // setters and getters

}
Run Code Online (Sandbox Code Playgroud)

最后,您的 AuditorAware bean:

@Component
class AuditorAwareImpl implements AuditorAware<AuditorDetails> {

    @Override
    public AuditorDetails getCurrentAuditor() {
        return new AuditorDetails()
                .setUsername("someUser")
                .setGroupname("someGroup");
    }
}
Run Code Online (Sandbox Code Playgroud)

AuditingHandler 从您的 AuditorAware bean(它必须是实现它的单个 bean)中获取您的自定义 AuditorDetails,并将其设置在您的可审计实体中。