enversを使用してデータ変更バージョンを記録する

5051 ワード

シーケンス
hibernateのenversモジュールは、データの変更を記録するための一連のメカニズムを提供します.ここで簡単に紹介します.
1.自動構成
@SpringBootApplication
@EnableJpaRepositories(repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class)
@EnableJpaAuditing(auditorAwareRef = "auditorAwareImpl")
public class EnversDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(EnversDemoApplication.class, args);
    }
}

ここで@EnableJpaRepositories(r e p o sitoryFactoryBeanClass=E n v e r s R i v i o nRepositoryFactoryBean.clss)を設定すると、enversモジュールがオンになります.
2.Audited注記
@Entity
@Audited
public class Book extends AuditableEntity{

    @javax.persistence.Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    private String title;

    private String author;

    private String description;

    private long price;

    private boolean valid;

    // getter and setter
}

@Auditedを使用して、このエンティティクラスの監査が必要です.
RevisionRepositoryの継承
public interface BookDao extends RevisionRepository,JpaRepository {
}

RevisionRepositoryを継承してrevisionsを検索するクエリー方法を取得します.主に次のようになります.
@NoRepositoryBean
public interface RevisionRepository> {
    Revision findLastChangeRevision(ID var1);

    Revisions findRevisions(ID var1);

    Page> findRevisions(ID var1, Pageable var2);

    Revision findRevision(ID var1, N var2);
}

ここでのNはバージョン番号を変更するタイプで、一般的にIntegerは十分で、足りないと思ったらLongタイプに変更できます.ここでTは実体クラスである.IDはエンティティークラスのプライマリ・キー・タイプです.
変更の問合せ
以上の構成により、変更された各バージョンを正常に記録できます.たとえば、次のような方法でクエリーできます.
Revisions revision = bookDao.findRevisions(id);
List> data = revision.getContent();

ここでのidはエンティティのidです
revisionのテーブル構造
hibernateのデフォルトはエンティティークラスの接尾辞です.AUDは、各変更のバージョンを記録します.例えば、
-- ----------------------------
--  Table structure for book_aud
-- ----------------------------
DROP TABLE IF EXISTS "public"."book_aud";
CREATE TABLE "public"."book_aud" (
    "id" int8 NOT NULL,
    "rev" int4 NOT NULL,
    "revtype" int2,
    "author" varchar(255) COLLATE "default",
    "description" varchar(255) COLLATE "default",
    "price" int8,
    "title" varchar(255) COLLATE "default",
    "valid" bool
)
WITH (OIDS=FALSE);
ALTER TABLE "public"."book_aud" OWNER TO "postgres";

-- ----------------------------
--  Primary key structure for table book_aud
-- ----------------------------
ALTER TABLE "public"."book_aud" ADD PRIMARY KEY ("id", "rev") NOT DEFERRABLE INITIALLY IMMEDIATE;

-- ----------------------------
--  Foreign keys structure for table book_aud
-- ----------------------------
ALTER TABLE "public"."book_aud" ADD CONSTRAINT "fk2u9iq76nh69r6f989ae7xft9" FOREIGN KEY ("rev") REFERENCES "public"."revinfo" ("rev") ON UPDATE NO ACTION ON DELETE NO ACTION NOT DEFERRABLE INITIALLY IMMEDIATE;

接尾辞を変更するにはorg.hibernate.envers.audit_table_suffixのプロパティを構成します.奥のrevフィールドはrevisionのバージョン番号を表し、一般的にグローバルに増加します.revtypeフィールドは操作タイプ、0は新規、1は更新、2は削除を表します.
もう1つのテーブルはrevinfoで、変更されたバージョン番号と時間を記録します.
-- ----------------------------
--  Table structure for revinfo
-- ----------------------------
DROP TABLE IF EXISTS "public"."revinfo";
CREATE TABLE "public"."revinfo" (
    "rev" int4 NOT NULL,
    "revtstmp" int8
)
WITH (OIDS=FALSE);
ALTER TABLE "public"."revinfo" OWNER TO "postgres";

-- ----------------------------
--  Primary key structure for table revinfo
-- ----------------------------
ALTER TABLE "public"."revinfo" ADD PRIMARY KEY ("rev") NOT DEFERRABLE INITIALLY IMMEDIATE;

カスタムrevision entity
デフォルトのenversの実装があなたの要件を満たしていない場合は、@RevisionEntity注釈を使用して@Auditedを置き換え、listenerをカスタマイズします.たとえば
@Entity
@RevisionEntity( ExampleListener.class )
public class ExampleRevEntity extends DefaultRevisionEntity {
    private String username;

    public String getUsername() { return username; }
    public void setUsername( String username ) { this.username = username; }
}
public class ExampleListener implements RevisionListener {

    public void newRevision( Object revisionEntity ) {
        ExampleRevEntity exampleRevEntity = ( ExampleRevEntity ) revisionEntity;
        Identity identity =
            (Identity) Component.getInstance( "org.jboss.seam.security.identity" );

        exampleRevEntity.setUsername( identity.getUsername() );
    }
}

具体的にはここで詳しくは言いませんが、具体的にはhibernateを参考にすることができます.
doc
  • envers