JBoss Envers 学习笔记

下文转自:http://www.blogjava.net/xmatthew/archive/2008/11/14/238432.html

 

试用JBoss Envers项目有一阵子了,趁Envers项目发布 1.1.0版,也同时把学习笔记共享给大家,希望对大家有所帮助。
    下面来看一下JBoss Envers项目的目的,官方说明如下:

The Envers project aims to enable easy versioning of persistent classes.
All that you have to do is annotate your persistent class or some of its properties,
that you want to version, with @Versioned. For each versioned entity, a table will be created,
which will hold the history of changes made to the entity. You can then retrieve and
query historical data without much effort.


   JBoss Envers目的是根据对实体的设置,提供记录执行数据变更历史的功能(数据变更版本)。Envers的配置非常简单,如果需要对某个实例进行历史数据版 本记录,只需要在实例上配置@Versioned annotation即可。 针对每个实体的版本的历史数据,Envers都会创建一个单独的数据表进行存储。
目前Envers支持Hibernate和Hibernate-entitymanager(JPA实现)

本示例以Hibernate-entitymanager为例,讲解其配置的方法:

先配置 persistence.xml, 加入 property配置

   < persistence-unit  >   
       
< provider > org.hibernate.ejb.HibernatePersistence </ provider >   
       
< class > </ class >   
       
< properties >   
           
< property  name ="hibernate.dialect"     />   
           
<!--  other hibernate properties  -->   
    
           
< property  name ="hibernate.ejb.event.post-insert"    
              value
="org.jboss.envers.event.VersionsEventListener"   />   
           
< property  name ="hibernate.ejb.event.post-update"    
              value
="org.jboss.envers.event.VersionsEventListener"   />   
           
< property  name ="hibernate.ejb.event.post-delete"    
              value
="org.jboss.envers.event.VersionsEventListener"   />   
           
< property  name ="hibernate.ejb.event.pre-collection-update"    
              value
="org.jboss.envers.event.VersionsEventListener"   />   
           
< property  name ="hibernate.ejb.event.pre-collection-remove"    
              value
="org.jboss.envers.event.VersionsEventListener"   />   
           
< property  name ="hibernate.ejb.event.post-collection-recreate"    
              value
="org.jboss.envers.event.VersionsEventListener"   />   
       
</ properties >   
   
</ persistence-unit >


示例代码:

 1     import  org.jboss.versions.Versioned;  
 2      
 3     import  javax.persistence.Entity;  
 4     import  javax.persistence.Id;  
 5     import  javax.persistence.GeneratedValue;  
 6     import  javax.persistence.Column;  
 7      
 8    @Entity  
 9    @Versioned
10     public   class  Blog {  
11        @Id  
12        @Column(length = 32 )
13         private  String id;  
14      
15        @Versioned
16        @Column(length = 100 )
17         private  String title; 
18         
19        @Column(length = 2000 )
20         private  String date;  
21      
22        @Versioned
23        @ManyToOne  
24         private  String body;  
25      
26           @ManyToOne 
27            private  Author author;
28         //  add getters, setters, constructors, equals and hashCode here  
29    } 
30    
31    @Entity
32    @Versioned
33     public   class  Author {
34    
35        @Id
36        @Column(length = 32 )
37         private  String id;
38        
39        @Versioned
40        @Column(length = 20 )
41         private  String name;
42        
43   }    


下面是进行测试的代码:

1  
   // 新增操作
   entityManager.getTransaction().begin();  
2     
3    Author matthew  =   new  Author( " 1 " " Matthew Xie " );  
4    Blog newBlog  =   new  Blog( " 1 " " Matthew's new Blog "   " TODO{add content here} " , matthew);    
5      
6    entityManager.persist(matthew);  
7    entityManager.persist(newBlog);  
8      
9    entityManager.getTransaction().commit();

 

 1     // 对Blog和author进行修改操作
 2    entityManager.getTransaction().begin();  
 3      
 4    Author author  =  entityManager.find(Author. class " 1 " );  
 5    Blog blog  =  entityManager.find(Blog. class " 1 " );  
 6      
 7     //  Changing the address's house number  
 8    author.setName( " Matt Xie " )
 9    
10    Author newAuthor  =   new  Author( " 2 " " newAuthor " );  
11      
12     //  change blog author to newAuthor 
13    blog.setAuthor(newAuthor);  
14      
15    entityManager.getTransaction().commit();

 

1     // 下面代码,演示了如何取得历史版本数据
2    VersionsReader reader  =  VersionsReaderFactory.get(entityManager); 
3    
4     //  get Blog all versions id
5    List < Number >  versions  =  reader.getRevisions(Blog. class " 1 " /* blog id */ );
6     for  (Number version : versions) {
7            Blog blog  =  reader.find(Blog. class " 1 " , version);  
8    }





注: 补充 Hibernate Envers的Property配置说明

Property nameDefault valueDescription
org.jboss.envers.versionsTablePrefix
String that will be prepended to the name of a versioned entity to create the name of the entity, that will hold version information.
org.jboss.envers.versionsTableSuffix_versionsString that will be appended to the name of a versioned entity to create the name of the entity, that will hold version information. If you version an entity with a table name Person , in the default setting Envers will generate a Person_versions table to store historical data.
org.jboss.envers.revisionFieldName_revisionName of a field in the versions entity that will hold the revision number.
org.jboss.envers.revisionTypeFieldName_revision_typeName of a field in the versions entity that will hold the type of the revision (currently, this can be: add, mod, del).
org.jboss.envers.revisionOnCollectionChangetrueShould a revision be generated when a not-owned relation field changes (this can be either a collection in a one-to-many relation, or the field using "mappedBy" attribute in a one-to-one relation).
org.jboss.envers.warnOnUnsupportedTypesfalseWhen true, a warning in the log will be issued when a property is versioned with an unsupported type, instead of an exception. This way, the configuration process isn't interrupted, but the version schema isn't complete (it lacks the unsupported properties, which won't be versioned).
org.jboss.envers.unversionedOptimisticLockingFieldfalseWhen true, properties to be used for optimistic locking, annotated with @Version, will be automatically unversioned (their history won't be stored; it normally doesn't make sense to store it).


JBoss Envers官方网址: http://www.jboss.org/envers

Good Luck!
Yours Matthew!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值