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