У меня есть объект с аннотацией @Entity
.
Если я отвечаю за создание сценариев CREATE TABLE
, зачем мне указывать @Column( nullable = false )
, если я могу создать столбец в базе данных с ключевыми словами NOT NULL
? Есть ли пример, показывающий преимущества использования этого свойства в поле?
Почему я должен указывать @Column (nullable = false)?
Ответы (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 для проверки схемы по модели объекта, вам нужно, чтобы они были синхронизированы.
hbm2ddl.auto
не предназначен для производства, и я тестирую свой проект с maven и управляемым экземпляром JBoss с Arquillian. Что касается второго, тогда было бы полезно только проверить мою схему? В этом случае я считаю, что многословие, которое оно приносит, того не стоит, если только нет лучшей причины, чем те.
- person Fagner Brack; 03.03.2013