[leoks@oc7612866413 ~]$ ls Downloads/apache-tomee-plus-1.6.0/lib/*jpa* Downloads/apache-tomee-plus-1.6.0/lib/openejb-jpa-integration-4.6.0.jar Downloads/apache-tomee-plus-1.6.0/lib/openjpa-2.3.0-nonfinal-1540826.jar
seems to be 2.3.0 [] Leo On Mon, Feb 10, 2014 at 2:34 PM, Leonardo K. Shikida <shik...@gmail.com>wrote: > it should be enabled since 2.2.0 > > > http://openjpa.apache.org/builds/2.2.0/apache-openjpa/docs/ref_guide_audit.html > > [] > > Leo > > [] > > Leo > > > On Mon, Feb 10, 2014 at 2:28 PM, James Talbut <jtal...@spudsoft.co.uk>wrote: > >> Hi Leo, >> >> That looks great, but my version of OpenJPA (2.2.2) doesn't seem to have >> two key functions: >> audited.getManangedFieldValue(field) >> audited.getOriginalFieldValue(field) >> >> What version are you using? >> >> Thanks >> >> Jim >> >> >> On Mon, Feb 10, 2014 at 02:06:18PM -0200, Leonardo K. Shikida wrote: >> > I am not sure if this is what want, but I do something like this with my >> > classes >> > >> > my audited entity >> > >> > @Auditable(values = { AuditableOperation.CREATE, >> AuditableOperation.UPDATE >> > }) >> > public class MyClass implements Serializable { >> > (...) >> > } >> > >> > my persistence.xml >> > >> > <property name="openjpa.Auditor" >> > >> value="my.DatabaseAuditor(sequence='false',synchDriver='oracle.jdbc.OracleDriver',synchDriverUser='myuser',synchDriverPassword='mypass',synchDriverJdbc='jdbc:oracle:thin:@localhost >> > :1521:XE')"/> >> > >> > my Auditor >> > >> > public class DatabaseAuditor implements Auditor { >> > >> > private AuditLogger defaultAuditor = new AuditLogger(); >> > private String synchDriver; >> > private String synchDriverUser; >> > private String synchDriverPassword; >> > private String synchDriverJdbc; >> > private String sequence; >> > >> > @Override >> > public void audit(Broker broker, Collection<Audited> newObjects, >> > Collection<Audited> updates, Collection<Audited> deletes) { >> > (...) >> > if (updates.size() > 0) { >> > for (Audited a : updates) { >> > this.addChangeLogForUpdate(a); >> > } >> > } >> > } >> > >> > and addChangeLogForUpdate can access both previous and new values just >> > using >> > >> > for (String field : audited.getUpdatedFields()) { >> > if (Arrays.asList(DatabaseAuditor.FIELDS).contains(field)) { >> > newdata.put(field, >> audited.getManangedFieldValue(field)); >> > olddata.put(field, >> audited.getOriginalFieldValue(field)); >> > //use driver info to save this using plain JDBC >> > >> > I hope it helps >> > >> > Leo >> > >> > >> > >> > [] >> > >> > Leo >> > >> > >> > On Mon, Feb 10, 2014 at 1:36 PM, Boblitz John < >> john.bobl...@bertschi.com>wrote: >> > >> > > I was working on something similar and this might get you closer >> > > >> > > StateManagerImpl sm = >> > > (StateManagerImpl)currentState.pcGetStateManager(); >> > > SaveFieldManager sfm = sm.getSaveFieldManager(); >> > > PersistenceCapable oldState = sfm.getState(); >> > > >> > > I believe you must also specifiy openjpa.RestoreState so that this can >> > > work ... >> > > >> > > Hope this helps ... >> > > >> > > John >> > > >> > > > -----Original Message----- >> > > > From: James Talbut [mailto:jtal...@spudsoft.co.uk] >> > > > Sent: Monday, February 10, 2014 3:10 PM >> > > > To: users@openjpa.apache.org >> > > > Subject: Any way to access original field values by name from >> Auditor >> > > context >> > > > >> > > > Hi, >> > > > >> > > > I'm trying to record old and new field values in an Auditor. >> > > > Using something like this I can get the new value (using the >> > > > audited.getUpdatedFields() to provide the values for 'field'): >> > > > >> > > > private Object getFieldValue(Broker broker, Object object, >> String >> > > field) { >> > > > if (object == null) { >> > > > return null; >> > > > } >> > > > PersistenceCapable persistenceCapable = >> > > > ImplHelper.toPersistenceCapable(object, >> > > > JPAFacadeHelper.toEntityManager(broker)); >> > > > OpenJPAStateManager stateManager = >> > > > (OpenJPAStateManager)persistenceCapable.pcGetStateManager(); >> > > > if (stateManager == null) { >> > > > return null; >> > > > } >> > > > int fieldIdx = >> > > stateManager.getMetaData().getField(field).getIndex(); >> > > > Object value = stateManager.fetch(fieldIdx); >> > > > if ((value instanceof RowSetHolder) && >> > > > (((RowSetHolder)value).getSize() == 0)) { >> > > > return null; >> > > > } >> > > > return value; >> > > > } >> > > > >> > > > But the old value has no state manager, so pcGetStateManager always >> > > returns >> > > > null. >> > > > >> > > > The old object does have the correct values set on it, but I don't >> have >> > > to have to >> > > > use reflection (and somehow work out the mapping from field name to >> > > method >> > > > name). >> > > > >> > > > Is there any equivalent to the above that will work for the old >> values >> > > (as >> > > > returned by audited.getOriginalObject()) ? >> > > > >> > > > Thanks. >> > > > >> > > > Jim >> > > >> > >