@Basic(необязательно = false) против @Column(nullable = false) в JPA
В чем разница между @Basic(optional = false)
а также @Column(nullable = false)
в JPA настойчивость?
2 ответа
Гордон Йорк (член комитета по архитектуре EclipseLink, главный технический специалист TopLink, член группы экспертов JPA 2.0) написал хороший ответ на эту тему, поэтому вместо того, чтобы перефразировать его, я процитирую его ответ:
Разница между
optional
а такжеnullable
это область, в которой они оцениваются. Определение "optional
'говорит о свойствах и значениях полей и предлагает, чтобы эта функция была оценена во время выполнения. 'nullable
'только в отношении столбцов базы данных.Если реализация выбирает для реализации
optional
затем эти свойства должны быть оценены в памяти провайдером постоянства, и перед отправкой SQL в базу данных возникает исключение, в противном случае при использовании 'updatable=false
''optional
о нарушениях никогда не сообщалось.
Поэтому я попробовал аннотацию @Basic(необязательно =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 может сделать, например.)