2016-07-07 65 views
4

我對JPA審計和@Embedded成員有問題。考慮以下示例場景:Spring數據審計和@Embedded JPA

我成立了一個Oracle數據庫的測試表:

CREATE TABLE AUDIT_TEST (
    ID   NUMBER(38) NOT NULL PRIMARY KEY, 
    CREATION_DATE TIMESTAMP(6) DEFAULT SYSTIMESTAMP NOT NULL 
); 

我定義了一個JPA @Entity與審計:

@Entity 
@EntityListeners(AuditingEntityListener.class) 
@Table(name = "AUDIT_TEST") 
public class AuditTest { 

    private Long id; 
    private LocalDateTime creationDate; 

    @Id 
    @Column(name = "ID") 
    public Long getId() { return id; } 

    public void setId(Long id) { this.id = id; } 

    @CreatedDate 
    @Column(name = "CREATION_DATE") 
    public LocalDateTime getCreationDate() { return creationDate; } 

    public void setCreationDate(LocalDateTime creationDate) { 
    this.creationDate = creationDate; 
    } 

} 

最後,我啓用JPA審計我@Configuration

@SpringBootApplication() 
@EnableJpaAuditing() 
public class AuditTestApplication { 
} 

到目前爲止好;當我構造一個AuditTest實例時,爲其分配一個ID並提交,creationDate列將按照預期填充當前時間戳。

然而,事情停止工作時,我封裝在一個@Embeddable審計列:

@Embeddable 
public class AuditTestEmbeddable { 

    private LocalDateTime creationDate; 

    @CreatedDate 
    @Column(name = "CREATION_DATE") 
    public LocalDateTime getCreationDate() { return creationDate; } 

    public void setCreationDate(LocalDateTime creationDate) { 
    this.creationDate = creationDate; 
    } 

} 

然後我改變我的實體類嵌入創建日期:

@Entity 
@EntityListeners(AuditingEntityListener.class) 
@Table(name = "AUDIT_TEST") 
public class AuditTest { 

    private Long id; 
    private AuditTestEmbeddable auditTestEmbeddable = new AuditTestEmbeddable(); 

    @Id 
    @Column(name = "ID") 
    public Long getId() { return id; } 

    public void setId(Long id) { this.id = id; } 

    @Embedded 
    public AuditTestEmbeddable getAuditTestEmbeddable() { 
    return auditTestEmbeddable; 
    } 

    public void setAuditTestEmbeddable(AuditTestEmbeddable auditTestEmbeddable) { 
    this.auditTestEmbeddable = auditTestEmbeddable; 
    } 

} 

不幸的是,審計已不再工作。

有沒有人知道在保留審計功能的同時仍然使用@Embedded類的方法?

+1

信息必須在託管實體上(至少這是如何完成和現在的工作)。所以目前沒有其他方法可以直接將其添加到實體中。 –

+0

你好,所以唯一可用的選擇是直接向每個實體添加所需的字段,例如:用戶創建者,用戶更新者,日期creationDate,日期updateDate?這是對的嗎? – Paolo

回答

0

Spring嵌套(可嵌入)類中的數據審計註釋尚不受支持。請求此功能the jira ticket

但是,我們可以使用自定義審計偵聽器在可嵌入類中設置審計信息。

下面是從博客取得的示例實現:How to audit entity modifications using the JPA @EntityListeners, @Embedded, and @Embeddable annotations

嵌入審計

@Embeddable 
public class Audit { 

    @Column(name = "created_on") 
    private LocalDateTime createdOn; 

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

    @Column(name = "updated_on") 
    private LocalDateTime updatedOn; 

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

    //Getters and setters omitted for brevity 
} 

審計監聽

public class AuditListener { 

    @PrePersist 
    public void setCreatedOn(Auditable auditable) { 
     Audit audit = auditable.getAudit(); 

     if(audit == null) { 
      audit = new Audit(); 
      auditable.setAudit(audit); 
     } 

     audit.setCreatedOn(LocalDateTime.now()); 
     audit.setCreatedBy(LoggedUser.get()); 
    } 

    @PreUpdate 
    public void setUpdadtedOn(Auditable auditable) { 
     Audit audit = auditable.getAudit(); 

     audit.setUpdatedOn(LocalDateTime.now()); 
     audit.setUpdatedBy(LoggedUser.get()); 
    } 
} 

可審計

public interface Auditable { 

    Audit getAudit(); 

    void setAudit(Audit audit); 
} 

示例實體

@Entity 
@EntityListeners(AuditListener.class) 
public class Post implements Auditable { 

    @Id 
    private Long id; 

    @Embedded 
    private Audit audit; 

    private String title; 

    }