Подтвердить что ты не робот

Как использовать значение по умолчанию для базы данных DB при использовании Hibernate save?

У меня есть столбец в БД со значением по умолчанию как sysdate. Я ищу способ получить это значение по умолчанию, когда я ничего не даю соответствующему свойству на стороне приложения. Кстати, я использую конфигурацию на основе аннотаций.

Любые советы?

4b9b3361

Ответ 1

Причина, по которой столбец даты получает значение null при вставке, даже если он определен как default SYSDATE dbms-side, заключается в том, что значение default для столбца используется, только если столбец не указан значение в запросе. Это означает, что он не должен появляться в предложении INSERT INTO, даже если ему было задано null.

Если вы хотите использовать default SYSDATE на стороне СУБД, вы должны настроить @Column с помощью insertable=false, чтобы вывести столбец из SQL INSERT s.

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "myDate", insertable=false)
private Date myDate;

Учтите, что этот подход всегда будет игнорировать значение, которое вы предоставляете свойству в приложении при создании объекта. Если вы действительно хотите иногда указывать дату, возможно, вам стоит использовать триггер DB для установки значения вместо значения по умолчанию.

Существует альтернатива использованию определения default SYSDATE СУБД. Вы можете использовать @PrePersist и @PreUpdate аннотации для присвоения текущей даты этому свойству до сохранения/обновления, если и только если он еще не назначен:

@PrePersist
protected void onCreate() {
    if (myDate == null) { myDate = new Date(); }
}

В этом тесно связанном вопросе предлагаются различные подходы: Временная метка создания и временное время последнего обновления с Hibernate и MySQL.

Ответ 2

Если вы используете Hibernate, вы можете просто использовать @CreationTimestamp для вставки даты по умолчанию.

@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "create_date")
private Date createDate;

и @UpdateTimestamp, чтобы обновить значение при необходимости

@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "modify_date")
private Date modifyDate;

Ответ 3

Просто поставьте insertable = false в определение @Column

см. ссылку для получения дополнительной информации

Ответ 4

Или вы можете инициализировать свойство pojo непосредственно, например,

//Объявление свойства Java-кода

private String surname = "default";