2013-03-03 17 views
33

Ho un'entità annotata con @Entity.
Se sono responsabile della creazione degli script CREATE TABLE, perché dovrei specificare @Column(nullable = false) quando posso creare una colonna nel database con le parole chiave NOT NULL? C'è qualche esempio che mostra i vantaggi dell'utilizzo di questa proprietà in un campo?Perché dovrei specificare @Column (nullable = false)?

risposta

44

Migliori messaggi di errore e gestione degli errori, soprattutto se si aggiunge anche lo JSR303 @NotNull annotation.

Se si crea la colonna come NOT NULL ma non si dice a JPA che non è nullo, JPA presuppone che i valori nulli siano OK. Quando si tenta di salvare un oggetto con valori null, si procederà all'invio al DB e si verificherà un errore a livello di database. Ciò aumenta lo spam di registro nel database ed è molto più difficile determinare dall'errore quale/e colonna/e di quale tabella (e) si sia verificato il problema, per non parlare di ritrasferirli ai loro nomi JPA.

Se le annoti come non nulle, JPA genera un'eccezione prima di salvare, evitando lo spam nei registri di DB e di solito ti dà un errore migliore. In particolare, se il tuo provider JPA supporta JSR303 e traduce nullable=false in internamente o hai aggiunto anche , ti fornirà una struttura dati che puoi esaminare per vedere esattamente quali campi di quali oggetti sono stati rifiutati per quali motivi, lungo con messaggi di errore personalizzabili.

Ecco perché è necessario comunicare a JPA i campi NOT NULL. Questo, ed è più facile per gli altri lavorare sul tuo codice per capire senza dover anche leggere lo schema del DB.

+1

ok, ma non è chiaro nella tua risposta se pensi che ci sia un valore aggiunto nell'avere sia @NotNull che @Column (nullable = false). Cosa ne pensi? – ymajoros

+1

@ymajoros Dipende un po 'da quanto è intelligente l'integrazione con JSR303/JPA. Tendo a inserirli entrambi, ma una buona integrazione JPA JSR303 aggiungerebbe un NotNull implicito per le colonne che sono nullable = false –

+2

Dovrebbero? Se non fa parte delle specifiche, non vedo perché e in quale contesto. Preferirei avere @NotNull ma nessun nullable = false, perché quest'ultimo è solo jpa. La mia domanda riguarda più il valore aggiunto di @Column (nullable = false). – ymajoros

3

Nel tuo caso potrebbe non esserci beneficio reale, ma:

  • se si utilizza il vostro fornitore di APP a generare lo schema (tramite Maven o tramite la generazione automatica come hbm2ddl.auto), quindi è importante
  • se si configura il provider jpa per convalidare lo schema rispetto al modello entità, è necessario che siano sincronizzati.
+0

La prima ipotesi può essere ignorata perché 'hbm2ddl.auto' non è destinato alla produzione e sto testando il mio progetto con Maven e un'istanza di JBoss gestita con Arquillian. Per quanto riguarda la seconda cosa sarebbe utile solo per convalidare il mio schema allora? In questo caso credo che la verbosità che porta non valga la pena, a meno che non ci sia una ragione migliore di quelle. –

+2

avere il proprio modello di entità e lo schema di db in sincronizzazione è importante. Potresti non usarlo ora, ma in seguito potresti aggiungere strumenti che ne hanno bisogno. Related http://techblog.bozho.net/?p=1100 – Bozho

16

Inoltre, se la vostra colonna ha nullable = false in @ManyToOne annotazione, Hibernate fa INNER JOIN query per la tabella correlata. nullable = true dà come risultato LEFT JOIN.

Questa è un'altra differenza.

+0

wow, questo è un po 'di intuizione. Grazie. – HopeKing

Problemi correlati