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 optionali
nullableto 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ć, optionalwó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” ” optionalnigdy nie zostaną zgłoszone.
Więc co tak naprawdę powinno być używane, może oba?
Xiè Jìléi
39
@Xie Jilei: Z książki: Trwałość języka Java z hibernacją 2007, s. 179: @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.
rapt
2
@rapt - nie rozumiem The @Basic annotation marks the property as not optional on the Java object level.Co to znaczy? Więc @Basicto tak, jakby powiedzieć, że tworzy kolumnę bazy danych NOT NULLdla tej zmiennej?
Erran Morad
9
Oznacza to, że jeśli spróbujesz utrwalić jednostkę z polem zerowym, zgłosi wyjątek, jeśli zostanie oznaczona jako opcjonalna = false (bez kontaktowania się z bazą danych), a jednostka nie zostanie dodana do kontekstu trwałości JPA. Jeśli jest tylko adnotacja, która ma mieć wartość null = false, jednostka zostanie dodana do kontekstu trwałości i podczas próby zapisania jednostki do bazy danych (na przykład przez opróżnienie) spróbuje zapisać jednostkę do bazy danych, która to zaprzeczy i wtedy zgłosi wyjątek.
Ray Hulha
@RayHulha Próbowałem dodać do pola adnotację „@Basic (opcjonalne = false)” i dodałem krotkę do bazy danych (z wartością tego pola = null), nie zgłoszono żadnego wyjątku !!, mam nadzieję, że możesz wyjaśnić mi to zachowanie.
ziMtyth
4
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).
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.)
Zabawne, że druga odpowiedź sugeruje, że dopuszcza wartość null, a nie Basic, który jest używany do generowania schematu (kiedy mówi, że „dopuszcza wartość null” odnosi się tylko do kolumn bazy danych ”). Wciąż jest to bardzo zagmatwane. Domyślam się, że wartość null jest używana do generowania schematu, a Basic (optional = false) może być używany do tego samego celu? Czy to ma sens?
marcus
optional = falsesłuży tylko do sprawdzania tego ograniczenia w czasie wykonywania. nullable = falsetworzy ograniczenie bazy danych. W przypadku aplikacji ustawienie optional = falsema również sens, ponieważ jest oceniane szybciej niż przechodzenie do bazy danych i sprawdzanie tam tego ograniczenia ..
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ódło
@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 danychNOT 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/
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.)
źródło
optional = false
służy tylko do sprawdzania tego ograniczenia w czasie wykonywania.nullable = false
tworzy ograniczenie bazy danych. W przypadku aplikacji ustawienieoptional = false
ma również sens, ponieważ jest oceniane szybciej niż przechodzenie do bazy danych i sprawdzanie tam tego ograniczenia ..