Hi Ilhan, Maybe I don't understand the request. Pinaki's example<http://webspherepersistence.blogspot.com/2009/01/auditing-with-openjpa.html>uses the JPA spec defined callbacks to get the previous state of the entity. I thought the problem you were hitting was the need to put the audit method in each entity. Using orm.xml you can define a single PostUpdate method which applies to every entity (of course that audit method may be tightly coupled to the entities in your PersistenceUnit).
Based on Pinaki's example I think this would work for you. On to your second question : I don't think you can inject a PersistenceContext or an EJB into a lifecycle callback method and you'd want to use a jndi lookup in this case. I'm not an expert with injection though so I could be proven wrong. Best Regards, -mike On Wed, Aug 12, 2009 at 3:42 AM, illhan <[email protected]> wrote: > > hi Michael, > I know the entity lifecyclelistener config in orm.xm,Thanks. > I think the entity lifecyclelistener is not fit for audit logging.I can not > get old state from the lifecyclelistener,and the lifecyclelistener is JPA > spec,not JEE5,so session bean or persistencecontext can not be injected in > lifecyclelistener,I must use the jndi lookup to find ejb or > entitymanager,is > it right? > Thanks Michael. > illhan > > Michael Dick wrote: > > > > Hi Illhan, > > > > The audit example from the persistence blog uses a @PostUpdate listener > to > > do the auditing. You can specify a default set of listeners for an entire > > persistence unit in an xml mapping file. For example : > > > > persistence.xml : > > > > <persistence-unit name="auditable-pu"> > > <mapping-file>orm.xml</mapping-file> > > </persistence-unit> > > > > orm/xml : > > <persistence-unit-metadata> > > <persistence-unit-defaults> > > <entity-listeners> > > <entity-listener class="foo.bar.Auditor"> > > <pre-persist method-name="prePersist" /> > > <post-persist method-name="postPersist" /> > > <pre-remove method-name="preRemove" /> > > <post-remove method-name="postRemove" /> > > <pre-update method-name="preUpdate" /> > > <post-update method-name="postUpdate" /> > > <post-load method-name="postLoad" /> > > </entity-listener> > > </entity-listeners> > > </persistence-unit-defaults> > > </persistence-unit-metadata> > > > > > > Foo.bar.Auditor.postUpdate() will operate on all the entities in your > > persistence unit - just like the annotation example in Pinaki's blog > post. > > > > Does that sound like what you want? > > > > -mike > > > > On Tue, Aug 11, 2009 at 10:19 AM, illhan <[email protected]> > wrote: > > > >> > >> hi Rick, > >> Because of the audit logging,I used the openJPA LifeCycleListener(maybe > >> other openjpa listerners) for audit logging. > >> I have try to record the audit logging by JPA lifecycle callbacks,but in > >> the > >> callbacks method's I can not get the old state,I only get the new > method. > >> The document > >> > http://webspherepersistence.blogspot.com/2009/01/auditing-with-openjpa.html > >> > http://webspherepersistence.blogspot.com/2009/01/auditing-with-openjpa.html > >> shows one method to record audit logging,but the audit method must be > >> added > >> in my all entites ,it is too complex for developers. > >> in my opinion,the openJPA LifeCycleListener maybe the best way to reduse > >> the > >> developers workload,if it can be used here.I can use event descriptor in > >> eclipselink(toplink),I only to register the event descriptor in > >> persistence.xml.So I would like to found the similar way in openJPA > >> environment. > >> > >> Thanks Rick. > >> illhan > >> > >> Michael Dick wrote: > >> > > >> > Hi Illhan, > >> > The method you want to use is part of OpenJPA's SPI layer, and isn't > >> > intended to be used by most applications. As a result the interface > may > >> be > >> > a > >> > bit more fluid than our 'normal' API methods. > >> > > >> > Could you elaborate on why you want to add a LifeCycleListener? We > >> might > >> > be > >> > able to suggest an alternative that accomplishes the same goal.. > >> > > >> > Best Regards, > >> > -mike > >> > > >> > On Mon, Aug 10, 2009 at 9:05 PM, illhan <[email protected]> > >> wrote: > >> > > >> >> > >> >> hi Rick, > >> >> You means the JPA lifecycle Callbacks,But I want to know the > openjpa's > >> >> listener,in package org.apache.openjpa.event,the interface > >> >> LifecycleListener > >> >> and the class LifecycleEvents. > >> >> From the javadoc,the LifecycleListener can be registered by the > >> method > >> >> addLifecycleListener(Object listener, Class... classes) from class > >> >> org.apache.openjpa.persistence.EntityManagerImpl,but in JEE container > >> the > >> >> EntityManager is inited by the container itself.How can I registere > >> the > >> >> LifecycleListener and process the LifecycleEvents.I have reviewed the > >> >> openjpa user's guide,but no part can be found there. > >> >> Thanks Rick. > >> >> illhan > >> >> > >> >> Rick Curtis wrote: > >> >> > > >> >> > Illhan - > >> >> > > >> >> > Did you read the section in the user manual detailing the usage of > >> >> > Lifecycle Callbacks [1]? > >> >> > > >> >> > -Rick > >> >> > > >> >> > [1] > >> >> > >> > http://openjpa.apache.org/builds/latest/docs/manual/manual.html#jpa_overview_pc_callbacks > >> >> > > >> >> > > >> >> > illhan wrote: > >> >> >> > >> >> >> hi Rick, > >> >> >> The EntityManager and the EntityManagerFactory are initializated > by > >> >> the > >> >> >> JEE contianer.I think the LifecycleListener could be set in > >> >> >> persistent.xml,not only used by java code. > >> >> >> Thanks Rick. > >> >> >> > >> >> >> illhan > >> >> >> > >> >> >> Rick Curtis wrote: > >> >> >>> > >> >> >>> Illhan - > >> >> >>> In your application initialization I believe you could do > >> something > >> >> like > >> >> >>> this to get a reference to the EntityManagerFactory.... > >> >> >>> > >> >> >>> OpenJPAEntityManager oem = > >> OpenJPAPersistence.cast(em); > >> >> >>> OpenJPAEntityManagerFactory oemf = > >> >> >>> OpenJPAPersistence.cast(oem.getEntityManagerFactory()); > >> >> >>> > >> >> >>> - Rick > >> >> >>> > >> >> >>> illhan wrote: > >> >> >>>> > >> >> >>>> In the javadoc there are many event and listener.I want to use > >> the > >> >> >>>> event and the listener in jee enviroment,the emf.add**Listener() > >> >> method > >> >> >>>> can't not called because in jee enviroment the > >> entitymanagerfacetory > >> >> is > >> >> >>>> created by jee contianer.i only use ejb3 injection in my session > >> >> bean > >> >> >>>> use @PersistenceContext > >> >> >>>> private EntityManager em; > >> >> >>>> so i don't know how to register the Listener(such as > >> >> LifecycleListener) > >> >> >>>> in JEE enviroment. > >> >> >>>> > >> >> >>>> illhan > >> >> >>>> > >> >> >>> > >> >> >>> > >> >> >> > >> >> >> > >> >> > > >> >> > > >> >> > >> >> -- > >> >> View this message in context: > >> >> > >> > http://n2.nabble.com/how-to-use-openjpa-event-listener---tp3397042p3421303.html > >> >> Sent from the OpenJPA Users mailing list archive at Nabble.com. > >> >> > >> > > >> > > >> > >> -- > >> View this message in context: > >> > http://n2.nabble.com/how-to-use-openjpa-event-listener---tp3397042p3424516.html > >> Sent from the OpenJPA Users mailing list archive at Nabble.com. > >> > > > > > > -- > View this message in context: > http://n2.nabble.com/how-to-use-openjpa-event-listener---tp3397042p3429428.html > Sent from the OpenJPA Users mailing list archive at Nabble.com. >
