Zamieszanie: @ NotNull vs @Column (nullable = false)

  1. Kiedy pojawiają się na polu/getterze @Entity, Jaka jest różnica między nimi? (Utrzymuję encję przez Hibernate).

  2. Do jakich RAM i/lub specyfikacji należy każdy z nich?

  3. @NotNull znajduje się w obrębie javax.validation.constraints. W javax.validation.constraints.NotNull javadoc jest napisane

    Element 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?

Author: Karl Richter, 2011-09-16

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.

 254
Author: Ryan Stewart,
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ąć.

 8
Author: Sebastian Theek,
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.

 4
Author: Aleksandar Radulović,
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