Pinaki, I agree with all your statements. I would like to keep the audit logging out of my business domain (separating of concerns). I just hadn't found a good way of doing this with JPA yet. Jim's approach gave me a way of being able to create new entities in @PreUpdate however with the drawbacks I mentioned (where one is that the domain model is affected).
Your solution avoided the relationship but didn't give a way to store the audit log in a separate table. I fully agree that the persistence of the audit logging should be independent of the domain objects and could even be in log files. I have been thinking of the approach you suggest but I didn't think it was supported. I'm sure it's not supported by JPA since it seems you're not allowed to create new entities in a @PreUpdate. Is it supported by OpenJPA? Will it stay supported? Thanks for your advice - I appreciate it, /Bengt 2011/7/13 Pinaki Poddar <ppod...@apache.org> > Hi, > > > > On PreUpdate I save an audit log entry describing the current entity. > > However, I guess I should > > audit log the object in its previous state not its current state - > > otherwise I need to audit log in the PreCreate as well - right? I think > > I'll have to use your solution, Pinaki, to get the previous state of the > > object since > > that's what I have to log in the PreUpdate. > > > > Yes. Any audit facility needs to have a snapshot of the entity when it > entered a persistence context, so at @PreUpdate or at any other time > points, > it can figure out what has essentially been changed about that entity in a > transaction. Now either one can build their own mechanics to store the > original state of the entity or can use OpenJPA's own facility to access > the > original state. The blog article showed the later approach. > > Secondly, in my view, an audit facility should be orthogonal. The actual > domain entity need not know that it is being audited. Thereby, the domain > entity need not have an association or knowledge of an Audit object. > > Thirdly, the audit facility should allow the audit information be stored in > a separate database, in the same database or may even be logged in a file. > That is to say that persistence of audit information should be decoupled > from persistence of the domain objects. > > If you intend to store audit information as a persistent entity in the same > database as the domain entity, then the simple solution is something like > this in a domain class: > > @PreUpdate > public void audit() { > Audit audit = new Audit(); > // now populate audit information > // .... some serious delta computation > > // Now get the entity manager that is managing this current domain > object > OpenJPAEntityManager em = > OpenJPAPersistence.getEntityManager(this); > > // And persist the audit information in the same transaction > em.persist(audit); > } > > > > > > ----- > Pinaki Poddar > Chair, Apache OpenJPA Project > -- > View this message in context: > http://openjpa.208410.n2.nabble.com/Audit-log-with-OpenJPA-tp6557932p6580549.html > Sent from the OpenJPA Users mailing list archive at Nabble.com. >