2010-09-20 10 views
5

Mamy wymóg dotyczący naszego projektu, w którym musimy zachować historię zmian wprowadzanych w niektórych jednostkach w aplikacji. Aplikacja jest aplikacją Java Web opartą na Struts, Spring i Hibernate. Jakie podejścia zostały zastosowane w tym przypadku?Rejestrowanie zmian jednostek w aplikacji internetowej Java

  • Wyzwalanie na odpowiednich tabelach to jeden pomysł, ale nie można ich łatwo utrzymać? i być może również nie powinny być częścią transakcji (ok, jeśli wyzwalacze się nie powiodą, ale transakcje aktualizacji jednostki nie powinny zawieść).
  • Używaj do tego celu AoP, ponieważ ma on charakter przekrojowy, ale musi być naprawdę ziarnisty, tak jak przy przechwytywaniu tylko wartości, gdy jednostka się zmienia. (Wszystkie edycje nie mają odpowiednich odpowiednich metod ... wiele zmian odbywa się w jednej metodzie java).
  • Skorzystaj z nasłuchiwania zdarzeń hibernacji.

Czy istnieją inne podejścia do wykonywania tego rodzaju działalności?

Odpowiedz

3

Bo mówiłeś

Wszystkie zmiany nie mają odpowiadające im różne metody ... wiele modyfikacji zdarzyć w jednym metody Java

Nawet jeśli metoda tylko otrzyma jeden argument jako Parametr i możesz odzyskać jego relacje, AOP wciąż może być fajnym pomysłem. Radzę, aby zobaczyć ten nice article

Dokumentacja sama Hibernate mówi:

Hibernate Interceptor pozwala na zastosowanie do kontroli i/lub manipulować właściwości obiektu trwałego zanim zostanie ona zapisana, zaktualizowane, usunięte lub załadowany . Jednym z możliwych zastosowań jest śledzenie informacji audytu.

Ale to też mówi

Upewnij się, że nie przechowują stany sessionspecific, ponieważ wiele sesji użyje tego przechwytywania potencjalnie jednocześnie

Jeśli używasz wiosny udało transakcja , możesz uzyskać sesję dołączoną do bieżącego wątku za pomocą metody sessionFactory.getCurrentSession();

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

Zobacz getCurrentSession() dokumentacja

Jeśli nie, należy utworzyć lokalną przechwytywania hibernacji (dołączony do otwartej sesji) zamiast globalnego kolektora (w załączeniu do SessionFactory), a następnie skonfigurować jego sesja

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

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

O wyzwalacze, zależy to od innych kwestii, takich jak administracja dB (DB masz dostęp administracyjny. Jeśli nie Porozmawiaj z DBA jest najlepszy).

+0

Dzięki za informację Arthur. Do prostej implementacji próbuję rozszerzyć słuchacza zdarzeń Hibernate. –

+0

+1, dla ogólnego wyjaśnienia. – Bozho

+0

+1 jak Bozho powiedział –

4

obsługuje przesłuchanie i wersjonowanie - spójrz.

+0

Interesujący (+1) Czy używasz go z powodzeniem? –

+0

@Arhtur - nie, niestety. Ale znam ludzi, którzy go używają i mówią, że to dobrze :) – Bozho

+0

I +1 też. Wydaje się, że Envers dobrze tu pasuje. –

Powiązane problemy