2010-07-30 11 views
6

La domanda è dove è meglio (o in altre parole: dove preferisci) mettere la logica di convalida aziendale delle entità Jpa.Convalida entità Jpa: in servizio o per ascoltatori del ciclo di vita

due idee sono:

  1. Nel EntityListener che prima di salvare o aggiornamento dovrebbe convalidare l'entità
  2. Nel servizio che fornisce l'accesso a metodi persistenti JPA.

Ci sono pro e contro di entrambi. Quando si utilizza l'approccio n. 2, è più facile testare poiché si può semplicemente prendere in giro il provider jpa e testare la logica di convalida. D'altra parte con l'approccio n. 1 la convalida avverrà nello stesso momento con convalide come @NotNull ecc.

Mi piacerebbe sapere come risolvi le convalide nei tuoi progetti e quale sia la via migliore da percorrere.

Grazie.

risposta

4

Ecco una regola empirica generale che seguo:

Quando si utilizza la convalida di fagioli, specificare regole che non richiedono dipendenze su altri fagioli. Nel momento in cui si dipende da su un altro bean, ottenere il livello di servizio per gestire tale dipendenza.

In altre parole, se si ha un riferimento a un bean all'interno di un altro, evitare di inserire quel vincolo @NotNull. Il tuo livello di servizio viene utilizzato al meglio per questo, perché stai rilevando la violazione molto prima e in un punto più logico (poiché altre convalide aziendali presumerebbero che i bean siano disponibili).

Come esempio, si consideri il seguente entità (scuse per esso non si compilano)

@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; 
} 

Il livello di servizio in questo caso, è quella che dovrebbe convalidare se l'utente ha un ruolo collegato o meno. La verifica nella fase pre-persistente o pre-aggiornamento è un po 'troppo tardi, soprattutto quando c'è un livello di servizio distinto che ha una logica di business e il resto della logica di business nel modello di dominio (purtroppo, non ho visto un applicazione abbastanza buona con tutta la logica nel solo modello di dominio).

Problemi correlati