@Basic(optional = false) vs @Column (nullable = false) в JPA

В чем разница между @Basic(optional = false) и @Column(nullable = false) в сохранении JPA?

Ответ 1

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

Разница между optional и nullable - это область, в которой они оцениваются. Определение 'optional' говорит о собственности и значения полей и предполагает, что это функция должна оцениваться в пределах во время выполнения. 'nullable' находится только в ссылка на столбцы базы данных.

Если реализация выбирает optional, тогда свойства должны оцениваться в памяти Поставщиком Стойкости и исключение, возникшее до отправки SQL-запроса к базе данных в противном случае при использовании 'updatable=false' 'optional' нарушения никогда не будут сообщаться.

Ответ 2

Итак, я попробовал аннотацию @Basic (optional = false), используя 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, например.)