Ответ 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.