Установка значения по умолчанию в Hibernate: руководство
Быстрый ответ
Для того чтобы установить статическое значение по умолчанию, метод прямого присваивания выглядит следующим образом:
@Entity
public class MyEntity {
private String propertyName = "defaultValue"; // Присваиваем начальное значение
}
Если значение должно быть вычислено динамически, используйте аннотацию @PrePersist
для его инициализации перед сохранением:
@Entity
public class MyEntity {
private String propertyName; // В значении данное значение не указано
@PrePersist
private void initializeDefaultValue() {
if (propertyName == null) {
propertyName = "Reddit любит котиков";
}
}
}
Для автоматического установления меток времени используйте аннотацию @CreationTimestamp
:
@Entity
public class MyEntity {
@CreationTimestamp
private Date creationDate; // Когда это создано?
}
Обзор настройки значений по умолчанию в Hibernate
Использование columnDefinition
Чтобы настроить значения по умолчанию на уровне базы данных, реализуйте аннотацию @Column
с параметром columnDefinition
:
@Column(name = "status", nullable = false, columnDefinition = "VARCHAR(10) DEFAULT 'PENDING'")
private String status;
Не забывайте о совместимости вашего кода; синтаксис columnDefinition
зависит от используемой вами системы управления базами данных.
Методы Hibernate: ColumnDefault
Воспользуйтесь аннотацией @ColumnDefault
, чтобы Hibernate выполнил установку значения по умолчанию:
@ColumnDefault("'New'")
private String status;
Не забудьте обновить схему после внесения изменений.
Использование dynamic-insert
Активируйте dynamic-insert для более эффективного вставления сущностей с null значениями:
<property name = "hibernate.dynamic-insert" value="true"/>
Dynamic-insert пропускает поля с null значениями, что положительно отвечает на производительность.
Установка значений перед сохранением
Чтобы устанавливать значения во время выполнения, пригодится аннотация @PrePersist
:
@PrePersist
public void onPrePersist() {
if (status == null) {
status = "Ваш кофе готов";
}
}
Заполнение не-null полей
Если поля не должны быть пустыми, используйте аннотацию @Column(nullable = false)
:
@Column(name = "email", nullable = false)
private String email;
Таким образом, заполнение полей гарантировано.
Управление сложными случаями значений по умолчанию
Для автоматической установки дат используйте аннотацию @CreationTimestamp
:
@CreationTimestamp
private LocalDateTime createdAt;
Для управления миграциями схем используйте инструмент Flyway.
Аннотацию @Generated(GenerationTime.INSERT)
можно использовать для обновления вычисляемых значений после операции insert.
Визуализация
Представьте себе, что настройки радио в вашем автомобиле уже заранее установлены:
| Автомобильное Радио (Сущность) | Настроенная Кнопка (Свойство) | Установленная Станция (Значение)
| ------------------------------ | --------------------------- | ----------------------------------
| 🚗 Радиомодель X | Кнопка 1 | 🎶 90.5 FM (По Умолчанию)
| 🚗 Радиомодель Y | Кнопка 2 | 🎸 101.2 FM (По Умолчанию)
То есть, вот как присвоить станцию по умолчанию сущности при её создании:
@Entity
public class Radio {
@Column(name = "station")
private String station = "90.5 FM"; // Ваш персональный лётчик времени.
}
Гармония простоты и изящества
Прямое присвоение значений переменным в Java
Простейший метод – это прямое присвоение значения переменной:
private String status = "active"; // Бодр как белка на кофеине!
Динамика сложных вычислений в Hibernate
Hibernate поможет в отображении более сложных расчётов:
@Formula("subtotal * (1 – discount_rate)")
private BigDecimal totalValue;
Используйте аннотацию @Formula
для вычисления значения на основе других полей.
Поддержание целостности значений после сохранения
Для поддержки целостности значений после их вставки иногда требуется выполнить обновление:
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@PostLoad
private void maintainGeneratedValues() {
// Обновляем данные, чтобы они всегда были актуальными!
}
Достижение профессионализма в работе с Hibernate
Осторожность при использовании columnDefinition
Несмотря на свои преимущества, использование columnDefinition
несет в себе определенные риски по совместимости и миграции, о которых нужно помнить.
Особенности @ColumnDefault
Важно понимать, что @ColumnDefault
не инициализирует значения в уже существующих столбцах при изменении схемы, а только помогает генератору DDL Hibernate.
Актуальность значений после сохранения
Может потребоваться @Generated
, чтобы обеспечить актуальность значений, но следует помнить о необходимости ручного обновления для корректного функционирования этого функционала.
Полезные материалы
- PrePersist (Java(TM) EE 7 Specification APIs)
- ColumnDefault (Hibernate Javadocs)
- Hibernate ORM User Guide
- sql server – can i have unique constrain on a NULLable fields? – Stack Overflow
- Auto Generated Values
- AttributeConverter (Java(TM) EE 7 Specification APIs)
- Standardized schema generation and data loading with JPA