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.
>

Reply via email to