Zamieszanie: @ NotNull vs @Column (nullable = false)
Kiedy pojawiają się na polu/getterze
@Entity
, Jaka jest różnica między nimi? (Utrzymuję encję przez Hibernate).Do jakich RAM i/lub specyfikacji należy każdy z nich?
-
@NotNull
znajduje się w obrębiejavax.validation.constraints
. Wjavax.validation.constraints.NotNull
javadoc jest napisaneElement przypisany nie może być null
Ale nie mówi o reprezentacji elementu w bazie danych, więc po co dodawać ograniczenie
nullable=false
do kolumny?
3 answers
@NotNull
jest adnotacją JSR 303 Bean Validation . Nie ma to nic wspólnego z ograniczeniami bazy danych. Ponieważ Hibernate jest referencyjną implementacją JSR 303, inteligentnie wychwytuje te ograniczenia i tłumaczy je dla Ciebie na ograniczenia baz danych, więc dostajesz dwa w cenie jednego. @Column(nullable = false)
jest sposobem JPA deklarowania kolumny jako not-null. Tzn. pierwszy jest przeznaczony do walidacji, a drugi do wskazywania schematu bazy danych szczegóły. Po prostu dostajesz dodatkowe (i zapraszamy!) help from Hibernate on the validation adnotations.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-03 06:30:23
Najnowsze wersje dostawcy Hibernate JPA stosują ograniczenia walidacji bean (JSR 303), takie jak @NotNull
do DDL domyślnie (dzięki hibernate.validator.apply_to_ddl property
domyślnie true
). Ale nie ma gwarancji, że inni dostawcy JPA to robią lub nawet mają taką możliwość.
Powinieneś użyć adnotacji walidacji bean, takich jak @NotNull
aby upewnić się, że właściwości bean są ustawione na wartość none-null podczas walidacji java beans w JVM (nie ma to nic wspólnego z ograniczeniami bazy danych, ale w większości sytuacje powinny im odpowiadać).
Powinieneś dodatkowo użyć adnotacji JPA, takiej jak @Column(nullable = false)
, aby dać dostawcy jpa wskazówki do wygenerowania odpowiedniego DDL do tworzenia kolumn tabeli z wymaganymi ograniczeniami bazy danych. Jeśli możesz lub chcesz polegać na dostawcy JPA, takim jak Hibernate, który domyślnie stosuje ograniczenia walidacji bean do DDL, możesz je pominąć.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-11 03:58:26
Co ciekawe, wszystkie źródła podkreślają, że @ Column(nullable = false) jest używany tylko do generowania DDL.
Jednak, nawet jeśli nie ma adnotacji @NotNull i hibernate.opcja check_nullability jest ustawiona na true, Hibernate wykona walidację elementów, które mają zostać utrzymane.
Wyrzuci właściwość PropertyValueException mówiącą, że "właściwość not-null odwołuje się do wartości NULL lub transient", jeśli atrybuty nullable = false nie mają wartości, nawet jeśli takie ograniczenia nie są zaimplementowane w warstwie bazy danych.
Więcej informacji o hibernate.opcja check_nullability jest dostępna tutaj: http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#configurations-mapping.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-02-21 11:42:13