Яка різниця між стійкістю @Basic(optional = false)
та @Column(nullable = false)
у програмі JPA?
Яка різниця між стійкістю @Basic(optional = false)
та @Column(nullable = false)
у програмі JPA?
Відповіді:
Гордон Йорк (член комітету з архітектури EclipseLink, головний технічний керівник TopLink, член експертної групи JPA 2.0) написав хорошу відповідь на цю тему, тому замість перефразовування його я процитую його відповідь :
Різниця між
optional
іnullable
полягає в тому, в якій області вони оцінюються. Визначення 'optional
' говорить про значення властивостей і значень поля і дозволяє припустити, що цю особливість слід оцінювати протягом часу виконання. 'nullable
' посилається лише на стовпці бази даних.Якщо реалізація вирішила реалізувати,
optional
то ці властивості повинні бути оцінені в пам'яті Постачальником Постійності та виняток, зроблений до відправлення SQL в базу даних, інакше при використанні 'updatable=false
' 'optional
' порушень ніколи не повідомлятиметься.
@Basic(optional = false) @Column(nullable = false)
Анотація @Basic позначає властивість як необов'язкове на рівні об’єктів Java. Другий параметр, який зводиться до нуля = хибний для відображення стовпців, відповідає лише за створення обмеження бази даних NOT NULL. Реалізація програми Hibernate JPA розглядає обидва варіанти однаково у будь-якому випадку, тому ви можете також використовувати лише одну з приміток для цієї мети.
The @Basic annotation marks the property as not optional on the Java object level.
що це означає? Отже, лише @Basic
як сказати, що роблять стовпчик бази даних NOT NULL
для вказаної змінної?
Тож я спробував анотацію @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.)
optional = false
призначено лише для перевірки цього обмеження під час виконання. nullable = false
створює обмеження в базі даних. Для додатків також встановлювати optional = false
сенс, оскільки він оцінюється швидше, ніж переходити до бази даних і перевіряти, чи є там обмеження ..