Java Hibernate envers如何向审核表添加字段

Java Hibernate envers如何向审核表添加字段,java,spring,spring-data-jpa,audit,hibernate-envers,Java,Spring,Spring Data Jpa,Audit,Hibernate Envers,我想要的是将@ModifiedBy,@LastModifiedDate,@CreatedBy和CreatedDate保存到所有审核表中。困难的是我不想在我的@EntityPOJO中包含这些字段。如果可能的话,这怎么办 是的,但是实现与您所说的略有不同 在实际审核行本身中引入这些内容的问题在于,您可能会面临大量非规范化数据分散在审核模式中的风险,特别是当您考虑到一个审核修订可以包含多个实体的事实时 完成您描述的任务的方法是分别处理各个部分 为了捕获执行审核操作的人,最好的方法是扩展或提供您自己的修

我想要的是将
@ModifiedBy
@LastModifiedDate
@CreatedBy
CreatedDate
保存到所有审核表中。困难的是我不想在我的
@Entity
POJO中包含这些字段。如果可能的话,这怎么办

是的,但是实现与您所说的略有不同

在实际审核行本身中引入这些内容的问题在于,您可能会面临大量非规范化数据分散在审核模式中的风险,特别是当您考虑到一个审核修订可以包含多个实体的事实时

完成您描述的任务的方法是分别处理各个部分

为了捕获执行审核操作的人,最好的方法是扩展或提供您自己的修订实体实现。在这个实体中,您将包含一列,用于存储用户名或您想要的任何用户标识值

为了在该实体中填充用户名或标识值,还需要编写一个自定义的
RevisionListener
,并在修订实体的
@RevisionEntity
注释中指定该值。您可以在用户文档中找到示例


为了获得修订的时间戳,您不仅需要获取该审计行的实体,还需要获取该修订行的实体。通过这样做,您不仅可以获得修订发生的时间戳、修改人的自定义字段,还可以获得修订的类型(添加、修改、删除),这样您就可以根据所读取的值是创建还是修改角色进行分支。

是的,但实现与您所说的略有不同

在实际审核行本身中引入这些内容的问题在于,您可能会面临大量非规范化数据分散在审核模式中的风险,特别是当您考虑到一个审核修订可以包含多个实体的事实时

完成您描述的任务的方法是分别处理各个部分

为了捕获执行审核操作的人,最好的方法是扩展或提供您自己的修订实体实现。在这个实体中,您将包含一列,用于存储用户名或您想要的任何用户标识值

为了在该实体中填充用户名或标识值,还需要编写一个自定义的
RevisionListener
,并在修订实体的
@RevisionEntity
注释中指定该值。您可以在用户文档中找到示例


为了获得修订的时间戳,您不仅需要获取该审计行的实体,还需要获取该修订行的实体。这样,您不仅可以获得修订发生的时间戳、更改人的自定义字段,还可以获得修订类型(ADD、MOD、DEL)因此,您可以接着讨论您正在读取的值是创建还是修改角色。

据我所知,您只是不希望在POJO类中创建这些字段,因此您可以创建一个包含审计相关字段的@MappedSuperclass,稍后您可以将其扩展到所有实体类。 例如,在这里,我创建了一个名为Auditable的抽象类,它将扩展到所有实体类

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
abstract class Auditable<User> {


@CreatedBy
@Column(nullable = false, updatable = false)
private String createdBy;

@CreatedDate
@Column(nullable = false, updatable = false)
private LocalDateTime created;

@LastModifiedBy
@Column(nullable = false)
private String modifiedBy;

@LastModifiedDate
@Column(nullable = false)
private LocalDateTime modified;



@Column(nullable = false)
@NotBlank(message = "username is required")
private String username;


public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public LocalDateTime getCreated() {
    return created;
}

public LocalDateTime getModified() {
    return modified;
}

public String getCreatedBy() {
    return createdBy;
}

public String getModifiedBy() {
    return modifiedBy;
}
}
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
可审核的抽象类{
@创造的
@列(nullable=false,Updateable=false)
创建的私有字符串;
@创建数据
@列(nullable=false,Updateable=false)
创建私有LocalDateTime;
@最后修改
@列(nullable=false)
私有字符串被修改;
@最后修改日期
@列(nullable=false)
修改私有LocalDateTime;
@列(nullable=false)
@NotBlank(message=“用户名是必需的”)
私有字符串用户名;
公共字符串getUsername(){
返回用户名;
}
public void setUsername(字符串用户名){
this.username=用户名;
}
public LocalDateTime getCreated(){
创建回报;
}
public LocalDateTime getModified(){
修改返回值;
}
公共字符串getCreatedBy(){
返回createdBy;
}
公共字符串getModifiedBy(){
返回被修改;
}
}
在此之后,您可以轻松地在所有实体类中使用它,因为这是一个超类,您可以在所有实体中使用它。例如,我正在创建一个名为Employee的实体,希望在其中设置可审核字段

@Entity
@Table
@EntityListeners(AuditingEntityListener.class)
public class Employee extends Auditable<String>{

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id ;

@Column(nullable = false)
private String empName ;

@Column(nullable = false)
private String department ;

@Column(nullable = false)
private Integer age ;




public Integer getAge() {
    return age;
}

public void setAge(Integer age) {
    this.age = age;
}

public String getDepartment() {
    return department;
}

public void setDepartment(String department) {
    this.department = department;
}

public String getEmpName() {
    return empName;
}

public void setEmpName(String empName) {
    this.empName = empName;
}

public Integer getId() {
    return id;
}

public void setId(Integer id) {
    this.id = id;
}
}
@实体
@桌子
@EntityListeners(AuditingEntityListener.class)
公共类Employee扩展了Auditable{
@身份证
@GeneratedValue(策略=GenerationType.AUTO)
私有整数id;
@列(nullable=false)
私有字符串名称;
@列(nullable=false)
私人弦乐部;
@列(nullable=false)
私人整数年龄;
公共整数getAge(){
回归年龄;
}
公共无效设置(整数期限){
这个。年龄=年龄;
}
公共部门(){
退货部;
}
公共部门(字符串部门){
这个部门=部门;
}
公共字符串getEmpName(){
返回empName;
}
public void setEmpName(字符串empName){
this.empName=empName;
}
公共整数getId(){
返回id;
}
公共无效集合id(整数id){
this.id=id;
}
}

据我所知,您不希望在POJO类中创建这些字段,因此您可以创建一个包含审计相关字段的@MappedSuperclass,稍后您可以将其扩展到所有实体类。 例如,在这里,我创建了一个名为Auditable的抽象类,它将扩展到所有实体类

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
abstract class Auditable<User> {


@CreatedBy
@Column(nullable = false, updatable = false)
private String createdBy;

@CreatedDate
@Column(nullable = false, updatable = false)
private LocalDateTime created;

@LastModifiedBy
@Column(nullable = false)
private String modifiedBy;

@LastModifiedDate
@Column(nullable = false)
private LocalDateTime modified;



@Column(nullable = false)
@NotBlank(message = "username is required")
private String username;


public String getUsername() {
    return username;
}

public void setUsername(String username) {
    this.username = username;
}

public LocalDateTime getCreated() {
    return created;
}

public LocalDateTime getModified() {
    return modified;
}

public String getCreatedBy() {
    return createdBy;
}

public String getModifiedBy() {
    return modifiedBy;
}
}
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
可审核的抽象类{
@创造的
@列(nullable=false,可更新=