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