2010-07-30 8 views
6

Pytanie brzmi: gdzie lepiej (lub innymi słowy: gdzie wolisz) umieścić logikę weryfikacji biznesowej jednostek Jpa.Sprawdzanie poprawności jednostek Jpa: w usłudze lub przez słuchaczy cyklu życia

Dwa pomysły są:

  1. W EntityListener że przed zapisaniem lub zmiana będzie zatwierdzenia podmiotu
  2. W usłudze, która umożliwia dostęp do metod JPA utrzymujących.

Istnieją zalety i wady obu. Korzystając z podejścia nr 2, łatwiej jest przetestować, ponieważ możesz po prostu sfałszować dostawcę jpa i przetestować logikę walidacji. Z drugiej strony z podejściem nr 1 walidacja miałaby miejsce w tym samym momencie z zatwierdzeniami, takimi jak @NotNull itp.

Chciałbym wiedzieć, w jaki sposób rozwiązuje się walidacje w swoich projektach i który jest lepszy.

Dzięki.

Odpowiedz

4

Oto ogólna zasada kciuka, które śledzę:

Podczas korzystania walidacji Bean, określić przepisy, które nie wymagają zależności na innych ziaren. W momencie, gdy będziesz zależał od na innym komponencie bean, uzyskaj warstwę usługi, aby obsłużyć tę zależność.

Innymi słowy, jeśli masz odniesienie do fasoli w innej, unikaj wprowadzania tego ograniczenia @NotNull. Warstwa serwisowa jest najlepiej do tego przystosowana, ponieważ dochodzisz do naruszenia znacznie wcześniej i bardziej logicznie (ponieważ inne walidacje biznesowe zakładają, że ziarna są dostępne).

Jako przykład rozważmy następujący podmiot (przeprosiny za to przyzwyczajenie kompilacji)

@Entity 
public class User 
{ 
    @Id 
    private int id; 
    @NotNull 
    private String fullName; 
    @NotNull 
    private String email; 
    private Set<Role> roles; //No bean validation constraints here. 
    ... 
    public boolean mapRoleToUser(Role role) 
    { //Validation is done here. Including checks for a null role. 
    } 

} 

@Entity 
public class Role 
{ 
    @Id 
    private int id; 
    @NotNull 
    private String name; 
} 

Warstwa obsługa w tym przypadku, to taki, który powinien zweryfikować, czy użytkownik ma rolę załączony czy nie. Weryfikacja w fazie przed utrwaleniem lub przed aktualizacją jest nieco za późno, szczególnie gdy istnieje odrębna warstwa usługowa, która ma logikę biznesową, a reszta logiki biznesowej w modelu domeny (niestety nie widziałem wystarczająco dobra aplikacja z całą logiką w samym modelu domeny).