Является ли Hibernate @JoinColumn (nullable = false) избыточным, если он не используется для генерации DDL?

Некоторые из наших организаций заявляют о связях OneToMany / OneToOne с nullable = false.

@OneToMany
@JoinColumn(name = "FK_ID", referencedColumnName = "ID", nullable = false)
private List<Things> manyThings;

Мы используем Flyway для DDL. Я читал во многих источниках, что свойство JoinColumnnullable используется только для генерации DDL - поэтому правильно ли я понимаю, что когда наши сценарии Flyway генерируют таблицы с ограничениями непосредственно в БД, свойство nullable = false в наших объектах является избыточным? Что именно подразумевается под DDL-генерацией и что в этом отношении предлагает Hibernate?

Я столкнулся с этой проблемой, потому что в некоторых таблицах оказалось, что ограничение для столбцов БД было Non-Null = true, тогда как для объектов Java было установлено свойство nullable = false. Похоже, что это не повлияло на приложение во время выполнения; он с радостью вставит значения null. Однако при запуске SpringBootTest произойдет сбой с нарушением ограничения.

Похоже, вы используете существующую базу данных в одном случае и тестовую базу данных или базу данных в памяти, такую ​​как H2DB, во втором случае. Во втором случае DDL создается, и база данных создается при каждом запуске. Вы должны знать, что такое DDL базы данных. В Hibernate EntityManager есть процедуры для генерации DDL для файлов, или вы можете включить отображение SQL в SpringBootTest и увидеть, как DDL создается и применяется.

K.Nicholas 31.07.2018 19:24

нет, в обоих случаях мы используем базу данных Oracle. В обоих случаях Flyway создает таблицы.

enp4yne 02.08.2018 10:03

Привет, enp4yne, есть ли обновления по этому поводу? Мой ответ ниже помог вам как-то?

Daniel Gonçalves 10.10.2019 17:17
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
150
1

Ответы 1

Это не только для генерации DDL, но и для аннотаций проверки Hibernate.

Когда вы говорите nullable = false, JPA генерирует ограничения базы данных (not-null) и ТАКЖЕ генерирует Проверка компонентов JSR 303, который не позволяет вам сохранять сущность, если столбец nullable = false имеет значение NULL во время выполнения. Итак, когда вы пишете nullable = false, JPA генерирует эти две функции по цене одной. @Column (nullable = false) - это способ JPA объявить столбец ненулевым.

Если значение nullable = false, следующее сохранение не будет выполнено:

ObjectThatContainsListThings a = new ObjectThatContainsListThings();
a.setListOfThings(null)

hibernate.persist(a);
DataIntegrityViolationException: not-null property references a null or transient value   

JPA выдаст это исключение вместо того, чтобы позволить базе данных найти проблему.

Другие вопросы по теме