2016-01-04 11 views
15

Qual è la differenza tra il controllo di convalida dei seguenti tre campi?Differenza tra @Size, @Length e @Column (lunghezza = valore)

@Entity 
public class MyEntity { 

    @Column(name = "MY_FIELD_1", length=13) 
    private String myField1; 
    @Column(name = "MY_FIELD_2") 
    @Size(min = 13, max = 13) 
    private String myField2; 
    @Column(name = "MY_FIELD_3") 
    @Length(min = 13, max = 13) 
    private String myField3; 

    // getter & setter 

} 

Ho letto che il primo ha a che fare con materiale DDL. Il secondo è per la convalida del bean. Il terzo è per la convalida dell'ibernazione.

È corretto? Quello che ancora non capisco è: quando devo usare quale? Quando si attiva una di queste annotazioni?

Modifica: Pensa alla seguente situazione: Dato il requisito di sviluppare un'entità con un campo di tipo stringa con lunghezza 13. Quale dei metodi sopra menzionati sceglieresti? O ancora meglio: quali domande devi porci per scoprire quale è adatto ai tuoi scopi?

+1

La colonna non ha nulla a che vedere con VALIDAZIONE. Le dimensioni sono standard JPA. La lunghezza è di proprietà. La risposta dovrebbe essere chiara da quella ... @ Size –

+0

La lunghezza è proprietaria? Quindi non sono autorizzato a usare questo in generale? – Chris311

+0

Come dice la risposta, si tratta di un'estensione del venditore specifica per Hibernate. Non ha senso usarlo (a parte persone che vorrebbero legarsi a un'implementazione JPA senza motivo) –

risposta

33
  1. @Column è un'annotazione JPA e l'attributo length viene utilizzato dallo strumento di generazione dello schema per impostare la lunghezza della colonna SQL associato.
  2. @Size è un'annotazione di convalida Bean che convalida che la stringa associata ha un valore la cui lunghezza è limitata dai valori minimo e massimo.
  3. @Length è una specifica annotazione Hibernate e ha lo stesso significato di @Size

Così sia 2. e 3. dovrebbe convalidare la lunghezza della stringa utilizzando Bean Validation. Prenderò 2. perché è generico.

+0

Non sto usando file di mappatura hbm, quindi 1 non è adatto a me, giusto? Quando uso Size over Length o utilizzo entrambi? – Chris311

+1

'@ Size' è universale, essendo definito da JPA. '@ Length' è disponibile solo per Hibernate. –

+7

'@ Size' è __not__ un'annotazione JPA a tutti. È un'annotazione API di validazione Bean! sarebbe anche meglio dire '@ Column' è un'annotazione JPA per l'uso da parte del provider JPA nella generazione dello schema (solo), poiché è utilizzabile da tutti i provider JPA. –

Problemi correlati