Jaka jest różnica między trwałością JPA @Basic(optional = false)
i między nimi @Column(nullable = false)
?
Jaka jest różnica między trwałością JPA @Basic(optional = false)
i między nimi @Column(nullable = false)
?
Odpowiedzi:
Gordon Yorke (członek komitetu architektury EclipseLink, główny kierownik techniczny TopLink, członek grupy ekspertów JPA 2.0) napisał dobrą odpowiedź na ten temat, więc zamiast go parafrazować, zacytuję jego odpowiedź :
Różnica między
optional
inullable
to zakres, w jakim są oceniane. Definicja „optional
” mówi o właściwościach i wartościach pól i sugeruje, że ta funkcja powinna zostać oceniona w czasie wykonywania. „nullable
” odnosi się tylko do kolumn bazy danych.Jeśli implementacja zdecyduje się zaimplementować,
optional
wówczas te właściwości powinny zostać ocenione w pamięci przez dostawcę trwałości, a wyjątek zgłoszony przed wysłaniem kodu SQL do bazy danych, w przeciwnym razie naruszenia przy użyciu „updatable=false
” ”optional
nigdy nie zostaną zgłoszone.
@Basic(optional = false) @Column(nullable = false)
Adnotacja @Basic oznacza, że właściwość nie jest opcjonalna na poziomie obiektu Java. Drugie ustawienie, nullable = false w mapowaniu kolumn, jest odpowiedzialne tylko za generowanie ograniczenia bazy danych NOT NULL. Implementacja Hibernate JPA w każdym przypadku traktuje obie opcje w ten sam sposób, więc równie dobrze możesz użyć do tego celu tylko jednej z adnotacji.
The @Basic annotation marks the property as not optional on the Java object level.
Co to znaczy? Więc @Basic
to tak, jakby powiedzieć, że tworzy kolumnę bazy danych NOT NULL
dla tej zmiennej?
Wypróbowałem więc adnotację @Basic (opcjonalne = false) za pomocą JPA 2.1 (EclipseLink) i okazuje się, że adnotacja jest ignorowana w rzeczywistym użyciu (przynajmniej dla pola typu String). (np. wywołania entityManager.persist).
Poszedłem więc do specyfikacji i poczytałem o tym. Oto, co ma do powiedzenia specyfikacja:
http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/
Podstawowe (opcjonalne): określa, czy wartość pola lub właściwości może być pusta. To jest wskazówka i jest lekceważona w przypadku typów prymitywnych; może być używany do generowania schematów.
Myślę więc, że to zdanie wyjaśnia prawdziwy przypadek użycia dla Basic (opcjonalne), które jest używane w generowaniu schematu. (To znaczy: kiedy generujesz CREATE TABLE SQL z klas Java Entity. Jest to coś, co może na przykład zrobić Hibernate.)
optional = false
służy tylko do sprawdzania tego ograniczenia w czasie wykonywania. nullable = false
tworzy ograniczenie bazy danych. W przypadku aplikacji ustawienie optional = false
ma również sens, ponieważ jest oceniane szybciej niż przechodzenie do bazy danych i sprawdzanie tam tego ograniczenia ..