2010-09-20 18 views
5

Abbiamo un requisito per il nostro progetto, in cui è necessario mantenere una sorta di cronologia delle modifiche apportate a determinate entità nell'applicazione. L'Applicazione è un'app Web Java basata su Struts, Spring e Hibernate. Che tipo di approcci sono stati usati in questo caso?Registrazione delle modifiche delle entità nell'applicazione Web Java

  • I trigger sulle rispettive tabelle sono un'idea ma non sono facilmente mantenibili? e forse anche loro non dovrebbero essere parte delle transazioni (ok se i trigger falliscono, ma le transazioni di aggiornamento delle entità non dovrebbero fallire).
  • Utilizzare AoP per questo poiché è un problema trasversale, ma deve essere veramente granulare, come nel catturare solo i valori quando l'entità cambia. (Tutte le modifiche non hanno i loro metodi differenti corrispondenti ... molte modifiche avvengono in un singolo metodo java).
  • Utilizzare gli ascoltatori di eventi di ibernazione.

Esistono altri approcci per questo tipo di attività?

risposta

3

Perché hai detto

Tutte le modifiche non hanno i corrispondenti metodi diversi ... molte modifiche avvengono in un unico metodo Java

Anche se il metodo solo ricevere un argomento come parametro ed è possibile recuperare le sue relazioni, AOP può ancora essere una buona idea. Io consiglio vivamente di vedere questo nice article

La documentazione di Hibernate stesso dice:

Hibernate Interceptor consente all'applicazione di ispezionare e/o manipolare proprietà di un oggetto persistente prima che venga salvato, aggiornato, cancellato o caricato . Un possibile utilizzo di questo è di tenere traccia delle informazioni di controllo.

Ma si dice anche

Assicurarsi che non si memorizzano stati sessionspecific, dal momento che più sessioni utilizzeranno quest'interceptor potenzialmente in concomitanza

Se si utilizza una molla gestita transazione , è possibile ottenere la sessione associata al thread corrente utilizzando sessionFactory.getCurrentSession();

public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { 
    if(entity instanceof SomeEntity) { 
     Session session = sessionFactory.getCurrentSession(); 

Vedi getCurrentSession() documentazione

In caso contrario, è necessario creare un intercettore Hibernate locale (attaccato alla sessione aperta) al posto di un intercettore globale (attaccato al SessionFactory), e poi, istituito la sua sessione

AuditableInterceptor interceptor = new AuditableInterceptor() 
Session session = sessionFactory.openSession(interceptor); 

/** 
    * do it before processing anything if you use local interceptor 
    */ 
interceptor.setSession(session); 

sui trigger, dipende da altre questioni come l'amministrazione DB (DB si ha accesso amministrazione. in caso contrario, Parlate con il DBA è la soluzione migliore).

+0

Grazie per le informazioni Arthur. Per la semplice implementazione sto cercando di estendere Hibernate Event Listener. –

+0

+1, per la spiegazione generale. – Bozho

+0

+1 come Bozho ha detto –

4

JBoss Envers supporta audizione e controllo versioni - dare un'occhiata.

+0

Interessante (+1) Lo usi con successo ?? –

+0

@Arhtur - no, purtroppo. Ma conosco persone che lo usano e dicono che è buono :) – Bozho

+0

E anche +1. Envers sembra adattarsi bene qui. –

Problemi correlati