В JPA я смущен, когда использую атрибут optional=false
и аннотацию @Column(nullable=false)
. В чем разница?
В чем разница между @ManyToOne (optional = false) и @Column (nullable = false)
Ответ 1
@Column(nullable=false)
- это инструкция для создания схемы. Столбец базы данных, сгенерированный с классом, будет помечен как недействительный в фактической базе данных.
optional=false
- это команда времени выполнения. Основная функциональная вещь, которую она делает, связана с Lazy Loading. Вы не можете ленить загружать объект, не связанный с коллекцией, если вы не помните, чтобы указать optional = false (потому что Hibernate не знает, должен ли там быть прокси-сервер или нуль, если вы не скажете ему, что nulls невозможны, поэтому он может генерировать прокси.)
Ответ 2
Оба используются для предотвращения нулевого значения, но если вы возражаете, что null должен быть заблокирован в...
Уровень базы данных (и вы хотите сгенерировать схему с помощью JPA) → использовать @Column(nullable=false)
время выполнения (и перед обращением к базе данных) → используйте optional=false
(намного быстрее, чем первая проверка).
Если вы хотите обе возможности, используйте их оба.