2013-04-03 8 views
5

Znalazłem kod w klasie encji:jakikolwiek powód, aby umieścić @NotNull adnotacji na polu @Id w klasie encji Java

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

Czy @NotNull adnotacji mają wartość, gdy @Id już ustawiony?

+3

Jeśli używasz wartości lub sekwencji automatycznie zwiększanej przez bazę danych, nie powinieneś używać adnotacji '@ NotNull'. Wyrzuciłby wyjątek podczas próby utrwalenia encji. – greenkode

+0

Hm ... Upraszczam kod, ale oryginalny ma '@ SequenceGenerator' i' @ GeneratedValue' i nie ma żadnych błędów w środowisku wykonawczym na insertach ... Wydaje się, że różne biblioteki i wersje zachowują się inaczej. Dzięki za zainteresowanie. +1. – gavenkoa

Odpowiedz

6

@NotNull dla celów walidacji, jak @Size. Definiuje reguły mechanizmu sprawdzania poprawności, aby sprawdzić, czy dane wejściowe użytkownika są prawidłowe. Sprawdzanie poprawności wokół tej adnotacji nie musi oznaczać, że obiekt jest również obiektem JPA, ale dwa są często używane razem.

Jeśli używasz javax.validation zamiast polegać na niepowodzeniu na poziomie DB (naruszenia ograniczeń), aby wskazać wartości null, powinieneś użyć obu adnotacji.

+0

Dzięki +1. Najbardziej bezpośrednia odpowiedź. – gavenkoa

0

Rozumiem, że ma to na celu analizę statyczną i nie ma nic wspólnego z hibernacją/orm. Czy jest to specyficzna adnotacja intellij?

Tak więc w momencie kompilacji można zostać ostrzeżonym, gdy zamierzasz przypisać wartość NULL do pola, które zostało oznaczone jako @NotNull.

I każdy zależny kod wie, że zwrócona wartość nigdy nie będzie pusta.

+2

To z JSR303 (Bean Validation), która jest podobna do JPA również częścią Java EE. – BalusC

1

Od id/primary key jest najważniejszym field w tabeli, to uniquely zidentyfikować wiersz w tabeli.

Tak więc nie powinno być null.

1

@Id służy do

* 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>. 

Więc nie dba o wartości null. Aby zapobiec wartości pustej @NotNull jest używany wraz z @Id.

+0

Dzięki. +1. Czytam http://docs.oracle.com/javaee/6/api/javax/validation/constraints/NotNull.html i http://docs.oracle.com/javaee/6/api/javax/persistence/Id. html, ale to nie pomoże mi w zrozumieniu ... – gavenkoa

+0

Zezwolenie na zerowy klucz podstawowy byłoby naruszeniem specyfikacji SQL. – Powerlord

0

Tak, to sprawi, że twoje pole id nie będzie zerowalne i musisz je podać jako obowiązkowe.

Ale jeśli chcesz id do autoIncrement następnie wyjmij ją i dodać

@GeneratedValue (strategia = GenerationType.AUTO)

Powiązane problemy