Почему я должен указывать @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 для проверки схемы в соответствии с моделью сущностей, то вам нужно, чтобы они были синхронизированы.
Другие вопросы по тегам