親エンティティで共通カラムを扱う

JPAエンティティに対して@MappedSuperclassアノテーションが付いたクラスを継承すると、子エンティティで親エンティティのカラムを扱うことができる。
これを使って、監査カラムなどを親エンティティに実装すると、共通した処理を親エンティティに集約できる。


親クラスでに書きメソッドを追加

  @PrePersist
  public void prePersist() {  
      setAuditColumn("prePersist");
  }
  @PreUpdate
  public void preUpdate(){
      setAuditColumn("preUpdate");
  }

@PrePersistはpersistメソッドを呼ぶ前に割り込みで実行される処理。同様に@PreUpdateはmergeメソッドを呼ぶ前に割り込みで実行される処理。
これらのアノテーションがついたメソッドを親エンティティに実装することで、子エンティティのメソッドに対して割り込み処理を実現できる。


DAOのソース

  public void whoTest(){
    ChildTr c = new ChildTr();
    c.setId((long)10);
    em.persist(c);
    em.flush();
    
    c = new XXPoCJpaTestMainTr();
    c.setId((long)1);
    em.merge(c);
    em.flush();
  }

親エンティティ―クラス全体

@MappedSuperclass
public class SuperTr implements Serializable{
  @Column
  @PlsqlObjectAttribute(name = "AUDITCOLUMN")
  private String auditColumn;
  
  
  @PrePersist
  public void prePersist() {  
      setAuditColumn("prePersist");
  }
  
  @PreUpdate
  public void preUpdate(){
      setAuditColumn("preUpdate");
  }
  
  public void setAuditColumn(String s){
    column10 = s;
  }
}

参考URL
http://d.hatena.ne.jp/tokuryo/20061022/1161517391
http://d.hatena.ne.jp/taedium/20051016/p1