首页 > 解决方案 > 在实体中自动填充 created_date、last_modified_date、created_by 和 last_modified_by:使用 JPA 进行休眠

问题描述

我是 Hibernate 和 JPA 的新手。我有几个实体,每个实体都包含以下四列:

1. created_by
2. last_modified_by
3. created_date
4. last_modified_date

我希望这些列在保存关联实体时自动填充。

两个示例实体如下:

实体 1:

    @Entity
    @Table(name = "my_entity1")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    public class MyEntity1 implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    private String name;

    @Column(name = "created_by")
    private String createdBy;

    @Column(name = "last_modified_by")
    private String lastModifiedBy;

    @Column(name = "created_date")
    private Instant createdDate;

    @Column(name = "last_modified_date")
    private String lastModifiedDate;
}

实体 2:

    @Entity
    @Table(name = "my_entity2")
    @Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
    public class MyEntity2 implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "description")
    private String description;

    @Column(name = "created_by")
    private String createdBy;

    @Column(name = "last_modified_by")
    private String lastModifiedBy;

    @Column(name = "created_date")
    private Instant createdDate;

    @Column(name = "last_modified_date")
    private String lastModifiedDate;
}

在这种情况下,我浏览了以下帖子:如何自动生成创建或修改的时间戳字段?如何使 created_at 列自动生成创建日期时间,就像自动创建 ID 一样?.

我正在了解如何捕获日期字段,但我无法理解如何捕获 created_by 和 last_modified_by。

标签: springhibernatejpa

解决方案


审计作者使用AuditorAwareSpring Security...

为了告诉 JPA 当前登录的用户,我们需要提供 AuditorAware 的实现并覆盖 getCurrentAuditor() 方法。在 getCurrentAuditor() 中,我们需要获取当前登录的用户。

像这样:

public class AuditorAwareImpl implements AuditorAware<String> {

    @Override
    public String getCurrentAuditor() {
        return "TestUser";
        // Can use Spring Security to return currently logged in user
        // return ((User) SecurityContextHolder.getContext().getAuthentication().getPrincipal()).getUsername()
    }
}

现在通过使用启用 jpa 审计@EnableJpaAuditing

@Configuration
@EnableJpaAuditing(auditorAwareRef = "auditorAware")
public class JpaConfig {
    @Bean
    public AuditorAware<String> auditorAware() {
        return new AuditorAwareImpl();
    }
}

看看这个以获得更多细节......


推荐阅读