2009-12-08 7 views
6

Pracuję nad aplikacją WWW JPA (Hibernate), Spring and Stripes. Mam wiele jednostek JPA, które mają wspólne pola dla celów audytu i zapytań:Ustawienie utworzone i zaktualizowane w jednostkach JPA automatycznie

createdBy - identyfikator użytkownika osoby, która utworzyła jednostkę. createdon - data jednostka powstała UpdatedBy - identyfikator użytkownika osoby, która ostatnia aktualizacja podmiotu updatedOn - dzień, w którym zostało ostatnio zaktualizowane

Mam moją aplikację pracuje tak, że są createdon i updatedOn ustawiany automatycznie, gdy obiekt jest trwały, ale nie jestem pewien, jak mogę uzyskać wypełnione pola createdBy i updatedBy bez konieczności przechodzenia przez identyfikator aktualnie zalogowanego użytkownika przez całą drogę z klasy kontrolera do DAO.

Czy ktoś ma jakieś sugestie, w jaki sposób mogę to zrobić bez przekazywania identyfikatora użytkownika w każdym miejscu? Zauważ, że bieżący identyfikator użytkownika jest aktualnie przechowywany w obiekcie HttpSession, więc mój serwer musi w jakiś sposób uzyskać dostęp do tych danych ...

Dzięki!

+0

Nie chcesz ustawić createdBy i updatedBy w kontrolerze, zanim będzie on trwał? – yihtserns

+0

Jakiego mechanizmu użyłeś do sprawdzenia, czy obiekt jest brudny, więc ustawiasz pola 'updateBy/At'? Zadałem powiązane pytanie, proszę sprawdź to: http: // stackoverflow.com/questions/20620406/how-to-set-user-id-on-entity-update – WelcomeTo

Odpowiedz

1

Zdecydowałem, że ThreadLocal jest prawdopodobnie najczystszym sposobem na zrobienie tego w mojej aplikacji.

3

Można przyjrzeć się jednej z tych podejść przekazać identyfikator użytkownika jako kontekst w warstwie biznesowej:

(Słupki mogą nadal być istotne nawet jeśli nie używasz EJB, drugi post ma sens tylko wtedy, gdy używasz Springa z JTA)

Osobiście odradzam te podejście, jak widzę dwa problemy z nim:

  • testowalności: dane kontekstowe będą musiały być ustawione w teście
  • kontraktu: dane kontekstowe uczestniczyć w umowie korzystania z jednostki, ale nie jest to wyraźnie widoczne w Interfejs.

Przekazywanie identyfikatora użytkownika "w każdym miejscu" może wydawać się dużą robotą, ale myślę, że jest czystsze.

Aby ustawić datę i identyfikator użytkownika automatycznie po utworzeniu lub aktualizacji jednostki, można użyć numeru EntityListener or lifecycle callbacks (może już to robisz). Nadzieja to pomaga ...

0

bym utworzyć klasę tak:


@MappedSuperclass 
public abstract class AuditableDomainClass { 
    private long createdBy; 
    private long updatedBy; 

    //getters and setters 

klasach jednostki, które mają wymóg już opisany po prostu przedłużyć tę klasę, którą cię zmienne w warstwie, którą musisz (na przykład kontroler) i nie musisz się martwić o to w dół w DAO.

+0

Tak, mam już coś takiego - moim problemem jest to, że nie chcę przekazywać zmiennych z warstwy kontrolera - ale wygląda na to, że muszę. – JMM

Powiązane problemy