![](/img/trans.png)
[英]How to add fields in audit table using Envers in Spring Boot
[英]Hibernate envers how to add fields to audit table
我想要的是將@ModifiedBy
, @LastModifiedDate
, @CreatedBy
和CreatedDate
保存到所有審核表中。 使事情變得困難的是,我不想在我的@Entity
POJO中包含這些字段。 如果有可能怎么辦?
是的,但是實現與您所說的略有不同。
在實際的審計行中引入這些內容的問題是,您冒着可能使大量非規范化數據散布在整個審計模式中的風險,尤其是當您考慮到一個審計修訂版可以包含多個實體的事實時。
實現您所描述的目標的對策是分開解決各個問題。
為了捕獲誰執行審核操作,執行此操作的最佳方法是擴展或提供您自己的修訂實體實施。 在此實體中,您將包括一欄,用於存儲用戶名或您想要的任何用戶標識值。
為了填充該實體中的用戶名或標識值,您還需要編寫一個自定義的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;
}
}
此后,您可以輕松地在所有實體類中使用它,因為這是超類,因此您可以在所有實體中使用它。 例如,我正在創建一個名為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;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.