My application uses large trees of domain objects and for most of these objects I’d like to persist some basic information (updatedby, modified time, etc.). I have already added these properties & columns to my application.
I was about to code the setting of these values in all the various constructors, etc. when it occurred to me that the persistence layer should handle this transparently.
But how?
I could certainly do this from within my DAO’s, but how to handle the objects that are persisted via a cascade save? Is there a way to intercept the persist() method on those?
What’s a good way to implement this capability?
If you intend to use JPA for the purpose of auditing, you can rely on the PrePersist and PreUpdate callback annotations. The JPA WikiBook has one such example. It helps greatly to have a mapped superclass in this case, otherwise you will continue to do this via “user” space code.
Another way of doing this, is to use triggers (ahem) on tables. This does have a performance impact though. The Openbravo ERP project appears to be using this approach for generating the audit trail.
Update: It is a good idea to have the auditing functionality separated out into a different class, other than the super class of the domain model. JPA Event listeners will help you achieve the same. A good example is present here.