Яка різниця між стійкістю @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сенс, оскільки він оцінюється швидше, ніж переходити до бази даних і перевіряти, чи є там обмеження ..