我们使用的是基本实体(我们在其中设置ID,创建+上次更改日期,…)。在此基础上,我们使用通用的持久性方法,该方法如下所示:
@Overridepublic <E extends baseEntity> ObjectId persist(E entity) { delta(entity); mongoDataStore.save(entity); return entity.getId();}delta方法如下所示(我将尝试使其尽可能通用):
protected <E extends baseEntity> void delta(E newEntity) { // If the entity is null or has no ID, it hasn't been persisted before, // so there's no delta to calculate if ((newEntity == null) || (newEntity.getId() == null)) { return; } // Get the original entity @SuppressWarnings("unchecked") E oldEntity = (E) mongoDataStore.get(newEntity.getClass(), newEntity.getId()); // Ensure that the old entity isn't null if (oldEntity == null) { LOG.error("Tried to compare and persist null objects - this is not allowed"); return; } // Get the current user and ensure it is not null String email = ...; // Calculate the difference // We need to fetch the fields from the parent entity as well as they // are not automatically fetched Field[] fields = ArrayUtils.addAll(newEntity.getClass().getDeclaredFields(), baseEntity.class.getDeclaredFields()); Object oldField = null; Object newField = null; StringBuilder delta = new StringBuilder(); for (Field field : fields) { field.setAccessible(true); // We need to access private fields try { oldField = field.get(oldEntity); newField = field.get(newEntity); } catch (IllegalArgumentException e) { LOG.error("Bad argument given"); e.printStackTrace(); } catch (IllegalAccessException e) { LOG.error("Could not access the argument"); e.printStackTrace(); } if ((oldField != newField) && (((oldField != null) && !oldField.equals(newField)) || ((newField != null) && !newField .equals(oldField)))) { delta.append(field.getName()).append(": [").append(oldField).append("] -> [") .append(newField).append("] "); } } // Persist the difference if (delta.length() == 0) { LOG.warn("The delta is empty - this should not happen"); } else { DeltaEntity deltaEntity = new DeltaEntity(oldEntity.getClass().toString(), oldEntity.getId(), oldEntity.getUuid(), email, delta.toString()); mongoDataStore.save(deltaEntity); } return;}我们的delta实体看起来像这样(没有getters + setters,toString,hashCode和equals):
@Entity(value = "delta", noClassnameStored = true)public final class DeltaEntity extends baseEntity { private static final long serialVersionUID = -2770175650780701908L; private String entityClass; // Do not call this className as Morphia will // try to work some magic on this automatically private ObjectId entityId; private String entityUuid; private String userEmail; private String delta; public DeltaEntity() { super(); } public DeltaEntity(final String entityClass, final ObjectId entityId, final String entityUuid, final String userEmail, final String delta) { this(); this.entityClass = entityClass; this.entityId = entityId; this.entityUuid = entityUuid; this.userEmail = userEmail; this.delta = delta; }希望这可以帮助您入门:-)



