2021-03-17 20:33发布
该项目是Spring Data JPA项目的扩展,允许访问由Hibernate Envers管理的实体修订
hibernate的envers模块提供了一整套机制可以用来记录数据的变更。这里简单介绍一下。
@SpringBootApplication @EnableJpaRepositories(repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class) @EnableJpaAuditing(auditorAwareRef = "auditorAwareImpl") public class EnversDemoApplication { public static void main(String[] args) { SpringApplication.run(EnversDemoApplication.class, args); } }
这里配置@EnableJpaRepositories(repositoryFactoryBeanClass = EnversRevisionRepositoryFactoryBean.class)表示开启envers模块。
@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标注一下这个实体类需要审计。
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
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表示删除。
另外还有一个表是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;
如果默认的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。
最多设置5个标签!
该项目是Spring Data JPA项目的扩展,允许访问由Hibernate Envers管理的实体修订
hibernate的envers模块提供了一整套机制可以用来记录数据的变更。这里简单介绍一下。
1.自动配置
2.Audited注解
使用@Audited标注一下这个实体类需要审计。
继承RevisionRepository
通过继承RevisionRepository获取查找revisions的查询方法,主要如下:
查询变更
经过以上配置之后,就可以正常记录变更的每个版本了,可以通过如下方法来查询,比如:
revision的表结构
hibernate默认以实体类后缀_AUD来记录每个变更的版本,比如
另外还有一个表是revinfo,记录每个变更的版本号和时间:
自定义revision entity
如果默认的envers的实现不满足你的要求的话,使用@RevisionEntity注解,替换@Audited,然后自定义listener,比如
一周热门 更多>