Hallo,
ich versuche mich gerade an Hibernate Envers.
Ich habe folgendes Problem:
- Derzeit nutze ich eine Entity (Activity), die mir quasi alle Aktivitäten trackt. Also "speichern", "update" etc.
Hierzu rufe ich bei der entsprechenden Methode (bspw. updateCustomer), die Methode "createActivity" auf.
Anschließend habe ich einen Eintrag in der Tabelle "Activity".
Mit Hibernate Envers möchte ich nun noch weiter gehen und protokolieren, was denn überhaupt geändert wurde.
Dazu habe ich es mit der Entity "Customer" probiert, was auch wunderbar funktioniert, sodass mir eine Kopie der Customer - Entity / Tabelle automatisch erzeugt wurde.
Nun kommt aber mein Problem:
- Ich würde gerne in der Actitvity - Tabelle die Referenz zu der entsprechenden Revision (AuditRevision_Fk) von Hibernate Enverse speichern. Die Revisionen werden in der Tabelle "AuditRevision" gespeichert. Hibernate Envers erzeugt ja automatisch im Hintergrund dann den Tabelleneintrag in der Customer_Audit - Tabelle und in der allgemeinen Revisions - Tabelle (heißt bei mir AuditRevision).
Nun habe ich gedacht, dass ich einfach in der "createActivity" - Methode den letzten Eintrag in der AuditRevision - Tabelle hole. Da funktioniert auch, aber es ist der falsche Eintrag, den für die aktuelle Operation ist der Eintrag noch nicht da.
D.h. wenn ich nun den Kunde update (updateCustomer), dann wird erst ganz am Ende dieser Methode der Eintrag in der "AuditRevision" - Tabelle erstellt - und genau diesen benötige ich um die Referenz in der Activity - Entity zu speichern.
Ich bräuchte nun entweder:
- Ich manage den Aufruf für Hibernate Envers selbst (wie die Activity),
- oder das Erstellen muss direkt nach der "entityManager.merge(customer);" - Ausführung erfolgen.
Hat hier jemand eine Idee?
ich versuche mich gerade an Hibernate Envers.
Ich habe folgendes Problem:
- Derzeit nutze ich eine Entity (Activity), die mir quasi alle Aktivitäten trackt. Also "speichern", "update" etc.
Hierzu rufe ich bei der entsprechenden Methode (bspw. updateCustomer), die Methode "createActivity" auf.
Anschließend habe ich einen Eintrag in der Tabelle "Activity".
Mit Hibernate Envers möchte ich nun noch weiter gehen und protokolieren, was denn überhaupt geändert wurde.
Dazu habe ich es mit der Entity "Customer" probiert, was auch wunderbar funktioniert, sodass mir eine Kopie der Customer - Entity / Tabelle automatisch erzeugt wurde.
Nun kommt aber mein Problem:
- Ich würde gerne in der Actitvity - Tabelle die Referenz zu der entsprechenden Revision (AuditRevision_Fk) von Hibernate Enverse speichern. Die Revisionen werden in der Tabelle "AuditRevision" gespeichert. Hibernate Envers erzeugt ja automatisch im Hintergrund dann den Tabelleneintrag in der Customer_Audit - Tabelle und in der allgemeinen Revisions - Tabelle (heißt bei mir AuditRevision).
Nun habe ich gedacht, dass ich einfach in der "createActivity" - Methode den letzten Eintrag in der AuditRevision - Tabelle hole. Da funktioniert auch, aber es ist der falsche Eintrag, den für die aktuelle Operation ist der Eintrag noch nicht da.
D.h. wenn ich nun den Kunde update (updateCustomer), dann wird erst ganz am Ende dieser Methode der Eintrag in der "AuditRevision" - Tabelle erstellt - und genau diesen benötige ich um die Referenz in der Activity - Entity zu speichern.
Ich bräuchte nun entweder:
- Ich manage den Aufruf für Hibernate Envers selbst (wie die Activity),
- oder das Erstellen muss direkt nach der "entityManager.merge(customer);" - Ausführung erfolgen.
Hat hier jemand eine Idee?
Java:
public void updateCustomer(Customer customer){
entityManager.merge(customer);
// Create Activity
activitiesProcessServiceBean.createActivity(customer,
customer.getEmployeeCreatorOrUpdate(),
Activities.ActionType.MODIFY.toString());
}
public Activities createActivity(EntityPropertyFinder entityPropertyFinder, Employee employeeCreator,
String activityType){
LOGGER.info("START createActivity");
Activities newActivities = new Activities();
// AuditRevision
AuditRevision auditRevision = jpaAuditUtilBean.findLastRevisionFromEntity(entityPropertyFinder.getClass(),
entityPropertyFinder.getId());
newActivities.setAuditRevision(auditRevision);
activitiesService.addActivities(newActivities);
return newActivities;
}
public AuditRevision findLastRevisionFromEntity(Class<? extends EntityPropertyFinder> class1, Long entityId) {
AuditReader auditReader = AuditReaderFactory.get(entityManager);
Object[] lastRevision = (Object[]) auditReader.createQuery()
.forRevisionsOfEntity(class1, false, false)
.add(AuditEntity.property("id").eq(entityId))
.addOrder(AuditEntity.revisionNumber().desc())
.setMaxResults(1)
.getSingleResult();
if(lastRevision == null)
return null;
AuditRevision auditRevision = (AuditRevision) lastRevision[1];
return auditRevision;
}