Today we made one presentation with the whole team of moove-it about rules engine in Java and Ruby.
We talk about Drools and ruleby.
![]() |
![]() |
We share the presentation …
Today we made one presentation with the whole team of moove-it about rules engine in Java and Ruby.
We talk about Drools and ruleby.
![]() |
![]() |
We share the presentation …
Envers is one of the Hibernate’s project sponsored by Redhat. Works with Hibernate and Hibernate Entity Manager.
Aims to enable easy auditing of persistent classes. For each audited entity you must annotate your persistent clases with @Audited, a table will be created, which will hold the history of changes made to the entity.
The idea is very similar to CVS or Subersion. Each transaction with updates, deletes or inserts made in the database with hibernate generate a new revision number. One transaction is one revision.
Envers provide a simple way to retrive your data of a revision using: revision number, date, queries with min and max function between others.
You can use Envers wherever Hibernate works: standalone, inside JBoss AS, with JBoss Seam or Spring.
It’s very easy …
@Entity @Audited
public class User {
private Long id;
@Id @GeneratedValue
public Long getId() { return id; }
public void setId(Long id) { this.id = id; }
// other fields and methods
...
}
When configuring your Hibernate (persistence.xml if you are using JPA, hibernate.cfg.xml or other if you are using Hibernate directly), add the following event listeners:
<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.hibernate.ejb.event.EJB3PostInsertEventListener,org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-update"
value="org.hibernate.ejb.event.EJB3PostUpdateEventListener,org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-delete"
value="org.hibernate.ejb.event.EJB3PostDeleteEventListener,org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.pre-collection-update"
value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.pre-collection-remove"
value="org.hibernate.envers.event.AuditEventListener" />
<property name="hibernate.ejb.event.post-collection-recreate"
value="org.hibernate.envers.event.AuditEventListener" />
</properties>
</persistence-unit>
Then, annotate your persistent class with @Audited (like the User example)
And that’s it!
Find audited data
You can access the audit (history) of an entity using the AuditReader interface, which you can obtain when having an open EntityManager.
AuditReader reader = AuditReaderFactory.get(entityManager); User oldUser = reader.find(User.class, userId, revision)
Search a revision number
the whole documentation is in the Web site: http://docs.jboss.org/envers/docs/index.html#queries
To ilustrate one example I show the way to search the max number revision of one Entity audited.
Number revision = (Number) reader.createQuery().forRevisionsOfEntity(User.class, false, true) .addProjection(AuditEntity.revisionNumber().max()) .add(AuditEntity.id().eq(userId)) .getSingleResult();
We use Envers in a few projects. Works fine and very quickly, we recomended … no dubt ! Envers
Web site: www.jboss.org/envers
Envers documentation: http://docs.jboss.org/envers/docs/index.html
Data caching is a very important consideration for JEE applications.
A classic problem for any application is to detect and solve the recurrent calls for optimizing the applications. Some cases can be:
Data caching limits the number of remote invocations in distributed applications and improves performance of web applications by reducing the number of calls.
Several solutions exist to include a framework for implementing a cache.
Check out this interesting comparative table.
I use whirlycache in two projects and works really good. I recommend it to incorporate in a simple lightweight Web application
Whirlycache is a fast, configurable in-memory object cache for Java. It can be used, for example, to speed up a website or an application by caching objects that would otherwise have to be created by querying a database or by another expensive procedure. From the testing that we have done, it appears to be faster than any other Java cache that we have been able to inspect.
(Step I) Donwload whirlycache and include it in your project -> https://whirlycache.dev.java.net/files/documents/1995/34601/whirlycache-1.0.1.zip
(Step II) Create a cache instance
CacheConfiguration cc = new CacheConfiguration();
cc.setName("KBCache");
cc.setBackend("com.whirlycott.cache.impl.ConcurrentHashMapImpl");
cc.setTunerSleepTime(60);
cc.setPolicy("com.whirlycott.cache.policy.LFUMaintenancePolicy");
cc.setMaxSize(10000);
Cache c = CacheManager.getInstance().createCache(cc);
(Step III) Use cache instance
c.store(key, object); c.remove(key); c.retrieve(key);
Example of java class (is a jboss seam entity class) – StockCache.java