One quick upgrade to 2.3.0 and my tests are passing. Thank you, that's a lot neater than I feared it would be.
Jim On Mon, Feb 10, 2014 at 02:36:00PM -0200, Leonardo K. Shikida wrote: > [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 > >> > > > >> > > > >