Установка значения по умолчанию в Hibernate: руководство

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Для того чтобы установить статическое значение по умолчанию, метод прямого присваивания выглядит следующим образом:

Java
Скопировать код
@Entity
public class MyEntity {
    private String propertyName = "defaultValue"; // Присваиваем начальное значение
}

Если значение должно быть вычислено динамически, используйте аннотацию @PrePersist для его инициализации перед сохранением:

Java
Скопировать код
@Entity
public class MyEntity {
    private String propertyName; // В значении данное значение не указано
    
    @PrePersist
    private void initializeDefaultValue() {
        if (propertyName == null) {
            propertyName = "Reddit любит котиков";
        }
    }
}

Для автоматического установления меток времени используйте аннотацию @CreationTimestamp:

Java
Скопировать код
@Entity
public class MyEntity {
    @CreationTimestamp
    private Date creationDate; // Когда это создано?
}
Кинга Идем в IT: пошаговый план для смены профессии

Обзор настройки значений по умолчанию в Hibernate

Использование columnDefinition

Чтобы настроить значения по умолчанию на уровне базы данных, реализуйте аннотацию @Column с параметром columnDefinition:

Java
Скопировать код
@Column(name = "status", nullable = false, columnDefinition = "VARCHAR(10) DEFAULT 'PENDING'")
private String status;

Не забывайте о совместимости вашего кода; синтаксис columnDefinition зависит от используемой вами системы управления базами данных.

Методы Hibernate: ColumnDefault

Воспользуйтесь аннотацией @ColumnDefault, чтобы Hibernate выполнил установку значения по умолчанию:

Java
Скопировать код
@ColumnDefault("'New'")
private String status;

Не забудьте обновить схему после внесения изменений.

Использование dynamic-insert

Активируйте dynamic-insert для более эффективного вставления сущностей с null значениями:

yaml
Скопировать код
<property name = "hibernate.dynamic-insert" value="true"/>

Dynamic-insert пропускает поля с null значениями, что положительно отвечает на производительность.

Установка значений перед сохранением

Чтобы устанавливать значения во время выполнения, пригодится аннотация @PrePersist:

Java
Скопировать код
@PrePersist
public void onPrePersist() {
    if (status == null) {
        status = "Ваш кофе готов";
    }
}

Заполнение не-null полей

Если поля не должны быть пустыми, используйте аннотацию @Column(nullable = false):

Java
Скопировать код
@Column(name = "email", nullable = false)
private String email;

Таким образом, заполнение полей гарантировано.

Управление сложными случаями значений по умолчанию

Для автоматической установки дат используйте аннотацию @CreationTimestamp:

Java
Скопировать код
@CreationTimestamp
private LocalDateTime createdAt;

Для управления миграциями схем используйте инструмент Flyway.

Аннотацию @Generated(GenerationTime.INSERT) можно использовать для обновления вычисляемых значений после операции insert.

Визуализация

Представьте себе, что настройки радио в вашем автомобиле уже заранее установлены:

Markdown
Скопировать код
| Автомобильное Радио (Сущность) | Настроенная Кнопка (Свойство) | Установленная Станция (Значение)
| ------------------------------ | --------------------------- | ----------------------------------
| 🚗 Радиомодель X               | Кнопка 1                    | 🎶 90.5 FM (По Умолчанию)
| 🚗 Радиомодель Y               | Кнопка 2                    | 🎸 101.2 FM (По Умолчанию)

То есть, вот как присвоить станцию по умолчанию сущности при её создании:

Java
Скопировать код
@Entity
public class Radio {
    @Column(name = "station")
    private String station = "90.5 FM"; // Ваш персональный лётчик времени. 
}

Гармония простоты и изящества

Прямое присвоение значений переменным в Java

Простейший метод – это прямое присвоение значения переменной:

Java
Скопировать код
private String status = "active"; // Бодр как белка на кофеине!

Динамика сложных вычислений в Hibernate

Hibernate поможет в отображении более сложных расчётов:

Java
Скопировать код
@Formula("subtotal * (1 – discount_rate)")
private BigDecimal totalValue;

Используйте аннотацию @Formula для вычисления значения на основе других полей.

Поддержание целостности значений после сохранения

Для поддержки целостности значений после их вставки иногда требуется выполнить обновление:

Java
Скопировать код
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@PostLoad
private void maintainGeneratedValues() {
    // Обновляем данные, чтобы они всегда были актуальными!
}

Достижение профессионализма в работе с Hibernate

Осторожность при использовании columnDefinition

Несмотря на свои преимущества, использование columnDefinition несет в себе определенные риски по совместимости и миграции, о которых нужно помнить.

Особенности @ColumnDefault

Важно понимать, что @ColumnDefault не инициализирует значения в уже существующих столбцах при изменении схемы, а только помогает генератору DDL Hibernate.

Актуальность значений после сохранения

Может потребоваться @Generated, чтобы обеспечить актуальность значений, но следует помнить о необходимости ручного обновления для корректного функционирования этого функционала.

Полезные материалы

  1. PrePersist (Java(TM) EE 7 Specification APIs)
  2. ColumnDefault (Hibernate Javadocs)
  3. Hibernate ORM User Guide
  4. sql server – can i have unique constrain on a NULLable fields? – Stack Overflow
  5. Auto Generated Values
  6. AttributeConverter (Java(TM) EE 7 Specification APIs)
  7. Standardized schema generation and data loading with JPA