2016-07-07 15 views
4

JPAの監査と@Embeddedのメンバーに問題があります。 I監査とJPA @Entityを定義Springデータの監査と@埋め込みJPA

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

:私は、Oracle DBにテストテーブルを設定

次の例のシナリオを考える最後

@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; 
    } 

} 

、Iは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

こんにちは、唯一利用可能なオプションは、すべてのエンティティに、次のような必要なフィールドを直接追加することです:User creator、User updater、Date creationDate、Date updateDate?それが正しいか? – Paolo

答えて

0

ネストされた(埋め込み可能な)クラスのスプリングデータ監査注釈は、まだサポートされていません。この機能をリクエストするのは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; 

    } 
関連する問題