@Basic (необов'язково = помилково) проти @Column (nullable = false) у JPA


103

Яка різниця між стійкістю @Basic(optional = false)та @Column(nullable = false)у програмі JPA?



14
Насправді не дублікат, питання стосується більше атрибутів, а не анотацій.
Паскаль Тивеннт

Нехай це допоможе більше stackoverflow.com/a/59497054/6191407
Sonu patel

Відповіді:


98

Гордон Йорк (член комітету з архітектури EclipseLink, головний технічний керівник TopLink, член експертної групи JPA 2.0) написав хорошу відповідь на цю тему, тому замість перефразовування його я процитую його відповідь :

Різниця між optionalі nullableполягає в тому, в якій області вони оцінюються. Визначення ' optional' говорить про значення властивостей і значень поля і дозволяє припустити, що цю особливість слід оцінювати протягом часу виконання. ' nullable' посилається лише на стовпці бази даних.

Якщо реалізація вирішила реалізувати, optionalто ці властивості повинні бути оцінені в пам'яті Постачальником Постійності та виняток, зроблений до відправлення SQL в базу даних, інакше при використанні ' updatable=false' ' optional' порушень ніколи не повідомлятиметься.


8
Отже, що насправді слід використовувати, можливо, обидва?
Xiè Jìléi

39
@Xie Jilei: З книги: Наполегливість Java зі сплячим режимом 2007, стор. 179: @Basic(optional = false) @Column(nullable = false)Анотація @Basic позначає властивість як необов'язкове на рівні об’єктів Java. Другий параметр, який зводиться до нуля = хибний для відображення стовпців, відповідає лише за створення обмеження бази даних NOT NULL. Реалізація програми Hibernate JPA розглядає обидва варіанти однаково у будь-якому випадку, тому ви можете також використовувати лише одну з приміток для цієї мети.
rapt

2
@rapt - я не розумію, The @Basic annotation marks the property as not optional on the Java object level.що це означає? Отже, лише @Basicяк сказати, що роблять стовпчик бази даних NOT NULLдля вказаної змінної?
Ерран Морад

9
Це означає, що якщо ви спробуєте зберегти об'єкт з нульовим полем, він викине виняток, якщо він позначений як необов'язковий = хибний (без контакту з базою даних) і сутність не буде додана до контексту стійкості JPA. Якщо зазначається лише нульове значення = false, сутність буде додана в контекст стійкості, а при спробі записати сутність в базу даних (наприклад, через флеш), вона спробує записати сутність в базу даних, яка буде заперечувати це і це викине виняток тоді.
Рей Хулха

@RayHulha Я спробував анотувати поле з "@Basic (необов'язково = false)", і я додав кортеж до бази даних (зі значенням цього поля = null), виняток не піднімався !!, я сподіваюся, ви можете пояснити мені така поведінка.
ziMtyth

4

Тож я спробував анотацію @Basic (необов'язково = помилкове), використовуючи JPA 2.1 (EclipseLink), і виявилося, що анотація ігнорується при фактичному використанні (принаймні для поля String). (наприклад, дзвінки entityManager.persist).

Тому я перейшов до специфікації і прочитав про це. Ось, що має сказати специфікація:
http://download.oracle.com/otndocs/jcp/persistence-2.0-fr-oth-JSpec/

Основне (необов’язково): чи може значення поля чи властивості бути нульовим. Це натяк і не враховується для примітивних типів; він може бути використаний для створення схеми.

Тому я думаю, що це речення пояснює реальний випадок використання для Basic (необов'язково), який використовується в генерації схем. (Тобто, коли ви генеруєте CREATE TABLE SQL з класів Java Entity. Наприклад, це може зробити Hibernate.)


1
Смішно, що з іншої відповіді випливає, що це нерегульоване, а не базове, що використовується для генерації схем (коли сказано, що "" nullable "є лише посиланням на колонки бази даних"). Це все ще дуже заплутано. Я припускаю , що обнуляється буде використовуватися для генерації схеми і Basic (факультативні = False) може бути використана для тих же цілей? Чи має це сенс?
marcus

optional = falseпризначено лише для перевірки цього обмеження під час виконання. nullable = falseстворює обмеження в базі даних. Для додатків також встановлювати optional = falseсенс, оскільки він оцінюється швидше, ніж переходити до бази даних і перевіряти, чи є там обмеження ..
nimo23
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.