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