enversを使用してデータ変更バージョンを記録する
5051 ワード
シーケンス
hibernateのenversモジュールは、データの変更を記録するための一連のメカニズムを提供します.ここで簡単に紹介します.
1.自動構成
ここで@EnableJpaRepositories(r e p o sitoryFactoryBeanClass=E n v e r s R i v i o nRepositoryFactoryBean.clss)を設定すると、enversモジュールがオンになります.
2.Audited注記
@Auditedを使用して、このエンティティクラスの監査が必要です.
RevisionRepositoryの継承
RevisionRepositoryを継承してrevisionsを検索するクエリー方法を取得します.主に次のようになります.
ここでのNはバージョン番号を変更するタイプで、一般的にIntegerは十分で、足りないと思ったらLongタイプに変更できます.ここでTは実体クラスである.IDはエンティティークラスのプライマリ・キー・タイプです.
変更の問合せ
以上の構成により、変更された各バージョンを正常に記録できます.たとえば、次のような方法でクエリーできます.
ここでのidはエンティティのidです
revisionのテーブル構造
hibernateのデフォルトはエンティティークラスの接尾辞です.AUDは、各変更のバージョンを記録します.例えば、
接尾辞を変更するにはorg.hibernate.envers.audit_table_suffixのプロパティを構成します.奥のrevフィールドはrevisionのバージョン番号を表し、一般的にグローバルに増加します.revtypeフィールドは操作タイプ、0は新規、1は更新、2は削除を表します.
もう1つのテーブルはrevinfoで、変更されたバージョン番号と時間を記録します.
カスタムrevision entity
デフォルトのenversの実装があなたの要件を満たしていない場合は、@RevisionEntity注釈を使用して@Auditedを置き換え、listenerをカスタマイズします.たとえば
具体的にはここで詳しくは言いませんが、具体的にはhibernateを参考にすることができます.
doc envers
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