2013-04-03 13 views
5

ho trovato codice nella classe entità:alcun motivo per mettere l'annotazione @NotNull campo @Id in Java classe di entità

@Id 
@NotNull 
@Column(name = "ID") 
private Long id; 

è @NotNull annotazione hanno valore quando @Id già impostati?

+3

Se si utilizza un valore o una sequenza autoincrementata del database, non utilizzare l'annotazione '@ NotNull'. Genera un'eccezione quando si tenta di mantenere l'entità. – greenkode

+0

Hm ... Semplifico il codice, ma quello originale ha '@ SequenceGenerator' e' @ GeneratedValue' e non ci sono errori in runtime sugli inserti ... Sembra che diverse librerie e versioni si comportino diversamente. Grazie per l'interesse +1. – gavenkoa

risposta

6

@NotNull è per scopi di convalida, come @Size. Definisce le regole per un motore di convalida per verificare se l'input dell'utente è ok. Fare una convalida attorno a queste annotazioni non indica necessariamente che l'oggetto sia anche un oggetto JPA, ma i due sono spesso usati insieme.

Se si utilizza javax.validation anziché fare affidamento su errore a livello di database (violazioni dei vincoli) per indicare valori nulli, è necessario utilizzare entrambe le annotazioni.

+0

Grazie +1. La maggior parte della risposta diretta. – gavenkoa

0

La mia comprensione è questa per l'analisi statica e non ha nulla a che fare con l'ibernazione/orm. È l'annotazione specifica intellij?

Così al momento della compilazione puoi essere avvisato quando stai per assegnare NULL a un campo che è stato annotato come @NotNull.

E qualsiasi codice che è dipendente sa che il valore restituito non sarà mai nullo.

+2

Viene da JSR303 (convalida dei bean), che è come JPA anche solo parte di Java EE. – BalusC

1

Dal id/primary key è il più importante field nella tabella, è uniquely identificare una riga nella tabella.

Quindi non dovrebbe essere null.

1

@Id è usato per

* Specifies the primary key of an entity. 
* The field or property to which the <code>Id</code> annotation is applied 
* should be one of the following types: any Java primitive type; 
* any primitive wrapper type; 
* <code>String</code>; 
* <code>java.util.Date</code>; 
* <code>java.sql.Date</code>; 
* <code>java.math.BigDecimal</code>; 
* <code>java.math.BigInteger</code>. 

Così non si prende cura di valori nulli. Per evitare valori nulli, viene utilizzato @NotNull insieme a @Id.

+0

Grazie. +1. Ho letto http://docs.oracle.com/javaee/6/api/javax/validation/constraints/NotNull.html e http://docs.oracle.com/javaee/6/api/javax/persistence/Id. html ma questo non mi aiuta a capire ... – gavenkoa

+0

Permettere una chiave primaria nullo sarebbe una violazione delle specifiche SQL. – Powerlord

0

Sì, questo renderà il campo id non annullabile e devi darlo obbligatorio.

Ma se si vuole id per AutoIncrement quindi rimuoverlo e aggiungere

@GeneratedValue (strategia = GenerationType.AUTO)

Problemi correlati