Некоторые из наших организаций заявляют о связях 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 произойдет сбой с нарушением ограничения.
нет, в обоих случаях мы используем базу данных Oracle. В обоих случаях Flyway создает таблицы.
Привет, enp4yne, есть ли обновления по этому поводу? Мой ответ ниже помог вам как-то?




Это не только для генерации 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 выдаст это исключение вместо того, чтобы позволить базе данных найти проблему.
Похоже, вы используете существующую базу данных в одном случае и тестовую базу данных или базу данных в памяти, такую как H2DB, во втором случае. Во втором случае DDL создается, и база данных создается при каждом запуске. Вы должны знать, что такое DDL базы данных. В Hibernate EntityManager есть процедуры для генерации DDL для файлов, или вы можете включить отображение SQL в SpringBootTest и увидеть, как DDL создается и применяется.