簡體   English   中英

Hibernate啟用了如何向審計表中添加字段

[英]Hibernate envers how to add fields to audit table

我想要的是將@ModifiedBy@LastModifiedDate@CreatedByCreatedDate保存到所有審核表中。 使事情變得困難的是,我不想在我的@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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM