2016-07-02 113 views
3

我有Spring MVC + JPA應用程序。審覈實體變更JPA

我有不斷變化的應用程序中的幾個實體。我希望能夠審覈這些變化。我發現有一個@Audited批註可跟蹤對某些字段或整個實體的更改。我想知道是否有任何方法來配置這個軌道選項 - 我希望能夠跟蹤什麼被改變了,誰改變了它。還有可能在SQL中的一個表中有幾個實體的改變?還有可能跟蹤 - @OneToMany實體中字段的更改嗎?

謝謝

回答

5

是的,您可以跟蹤所做的更改,更新的用戶和時間戳。

Hibernate提供@Audited註釋來維護實體版本。

Spring提供@CreatedBy@LastModifiedBy@CreatedDate@LastModifiedDate註解,在這些需要提供使用AuditorAware豆誰更新的用戶名。

要啓用審計,

  1. 應配置類添加@EnableJpaAuditing對實體
  2. @Audited@EntityListeners(AuditingEntityListener.class)
  3. AuditorAware<T>提供的用戶名
  4. 兒童實體應與@Audited
來註釋

實施例

@Bean 
public AuditorAware<String> createAuditorProvider() { 
    return() -> "username"; // should be from context/session 
} 

對於一個額外的表將被創建,以保持每個版本的實體

  1. {ENTITY_NAME}_AUD //可以覆蓋審計表名稱的前綴和後綴
  2. REVINFO

下面是一個與休眠和春季審計的一對多關係的例子

UserInfo.java

@Audited 
@Entity 
@EntityListeners(AuditingEntityListener.class) 
public class UserInfo extends AuditInfo { 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Column 
    private String name; 

    @OneToMany(mappedBy = "userInfo", fetch = FetchType.EAGER, cascade = CascadeType.ALL) 
    private List<UserAddress> addresses; 

} 

UserAddress.java

@Entity 
@Audited 
@EntityListeners(AuditingEntityListener.class) 
public class UserAddress extends AuditInfo { 

    @Id 
    @GeneratedValue 
    private Long addressId; 

    @ManyToOne 
    @JoinColumn(name = "id", nullable = false) 
    private UserInfo userInfo; 

    @Column 
    private Long no; 

    @Column 
    private String street; 

} 

AuditInfo.java

@EntityListeners(AuditingEntityListener.class) 
@MappedSuperclass 
public abstract class AuditInfo { 

    @CreatedBy 
    private String createdBy; 

    @LastModifiedBy 
    private String updatedBy; 

    @CreatedDate 
    private LocalDateTime createdOn; 

    @LastModifiedDate 
    private LocalDateTime updatedOn; 

} 
+0

我可以使用Hibernate JPA和Spring數據JPA同一時間?我無法識別@EnableJpaAuditing。我需要爲此導入什麼庫? – Purmarili

+0

'spring-data-jpa','hibernate-jpa'和'hibernate-envers' – Saravana

+0

嗨我很晚了,請問這些表是如何創建的? – Vipul