Почему я должен указывать @Column (nullable = false)?

У меня есть объект с аннотацией @Entity.
Если я отвечаю за создание сценариев CREATE TABLE, зачем мне указывать @Column( nullable = false ), если я могу создать столбец в базе данных с ключевыми словами NOT NULL? Есть ли пример, показывающий преимущества использования этого свойства в поле?


person Fagner Brack    schedule 03.03.2013    source источник


Ответы (3)


Улучшенные сообщения об ошибках и обработка ошибок, особенно если вы также добавите Аннотация JSR303 @NotNull.

Если вы создадите столбец как NOT NULL, но не сообщите JPA, что он не нулевой, JPA предположит, что нулевые значения допустимы. Когда вы попытаетесь сохранить объект с нулями, он отправит его в БД, и вы получите ошибку уровня БД. Это увеличивает спам журналов в базе данных, и гораздо сложнее определить по ошибке, какой столбец (столбцы) какой таблицы (таблиц) были проблемой, не говоря уже о том, чтобы сопоставить их обратно с их именами JPA.

Если вы аннотируете их как ненулевые, JPA выдаст исключение перед сохранением, избегая спама в журнале БД и обычно давая вам лучшую ошибку. В частности, если ваш провайдер JPA поддерживает JSR303 и либо преобразует nullable=false в @NotNull внутренне, либо вы также добавили @NotNull, он предоставит вам структуру данных, которую вы сможете изучить, чтобы увидеть, какие именно поля каких объектов были отклонены по каким причинам, а также с настраиваемыми шаблонными сообщениями об ошибках.

Вот почему вы должны сообщить JPA о NOT NULL полях. Это, и другим, работающим над вашим кодом, легче понять, не читая схему БД.

person Craig Ringer    schedule 03.03.2013
comment
хорошо, но в вашем ответе неясно, считаете ли вы, что наличие как @NotNull, так и @Column (nullable = false) имеет дополнительную ценность. Что вы думаете? - person ymajoros; 08.05.2013
comment
@ymajoros Немного зависит от того, насколько умна ваша интеграция JSR303 / JPA. Я склонен вставлять оба, но хорошая интеграция JPA JSR303 добавит неявный NotNull для столбцов, которые имеют значение null=false. - person Craig Ringer; 08.05.2013
comment
Должны ли? Если это не часть спецификации, я не понимаю, почему и в каком контексте. Я бы предпочел @NotNull, но не nullable=false, потому что последний - только jpa. Мой вопрос больше о добавленной стоимости @Column (nullable = false). - person ymajoros; 08.05.2013

Кроме того, если ваш столбец имеет аннотацию nullable = false в @ManyToOne, Hibernate выполняет запрос INNER JOIN к связанной таблице. nullable = true дает результат LEFT JOIN.

Это другое отличие.

person Adam Tychoniewicz    schedule 02.07.2015

В вашем случае может не быть фактической выгоды, но:

  • если вы используете своего провайдера jpa для создания своей схемы (либо с помощью maven, либо с помощью автоматической генерации, такой как hbm2ddl.auto), то это имеет значение
  • если вы настроите своего провайдера jpa для проверки схемы по модели объекта, вам нужно, чтобы они были синхронизированы.
person Bozho    schedule 03.03.2013
comment
Первое предположение можно игнорировать, потому что hbm2ddl.auto не предназначен для производства, и я тестирую свой проект с maven и управляемым экземпляром JBoss с Arquillian. Что касается второго, тогда было бы полезно только проверить мою схему? В этом случае я считаю, что многословие, которое оно приносит, того не стоит, если только нет лучшей причины, чем те. - person Fagner Brack; 03.03.2013
comment
важно синхронизировать вашу модель объекта и схему базы данных. Вы можете не использовать его сейчас, но позже вы можете добавить инструменты, которые в нем нуждаются. Похожие techblog.bozho.net/?p=1100 - person Bozho; 03.03.2013