У меня есть объект, аннотированный с помощью @Entity
.
Если я отвечаю за создание сценариев CREATE TABLE
, почему я должен указывать @Column( nullable = false )
, когда я могу создать столбец в базе данных с ключевыми словами NOT NULL
? Есть ли какой-либо пример, показывающий преимущества использования этого свойства в поле?
Почему я должен указывать @Column (nullable = false)?
Ответ 1
Улучшенные сообщения об ошибках и обработка ошибок, особенно если вы также добавили JSR303 @NotNull аннотация.
Если вы создадите столбец как NOT NULL
, но не сообщите JPA, что он не является нулевым, JPA будет считать, что нулевые значения в порядке. Когда вы пытаетесь сохранить объект с нулями, он перейдет к отправке в БД, и вы получите ошибку уровня DB. Это увеличивает лог-спам в базе данных, и из ошибки, которую столбец (-ов) столкнулся с проблемой, гораздо труднее определить, а не отображать их обратно в имена JPA.
Если вы аннотируете их как не равные нулю, JPA выдаст исключение перед сохранением, избегая спама в журнале БД и обычно давая вам лучшую ошибку. В частности, если ваш поставщик JPA поддерживает JSR303 и либо переводит nullable=false
в @NotNull
внутренне, либо вы добавили @NotNull
тоже, он даст вам структуру данных, которую вы можете проверить, чтобы точно определить, какие поля были для объектов отклоняется по каким причинам, а также настраиваемые шаблонные сообщения об ошибках.
Вот почему вы должны сообщить JPA о NOT NULL
. Это, и это проще для других, работающих над вашим кодом, чтобы понять, не имея также необходимости читать схему БД.
Ответ 2
Кроме того, если ваш столбец имеет nullable = false
в @ManyToOne
аннотации, Hibernate делает запрос INNER JOIN в соответствующую таблицу. nullable = true
дает результат LEFT JOIN.
Это другая разница.
Ответ 3
В вашем случае может не быть фактической выгоды, но:
- Если вы используете поставщик jpa для генерации вашей схемы (либо через maven, либо через автоматическое создание, например hbm2ddl.auto), тогда это имеет значение
- Если вы настроите поставщика jpa для проверки схемы по модели сущности, вам необходимо синхронизировать ее.