Как получить новейшее (текущее) значение времени, указанное в DEFAULT CURRENT_TIMESTAMP для свойства объекта jpa? - PullRequest
1 голос
/ 21 февраля 2020

У меня есть объект JPA, который содержит два столбца, createdTime и modifiedTime. Я хотел бы использовать функцию MySQL DEFAULT CURRENT_TIMESTAMP, чтобы сгенерировать правильное значение времени для этого двух столбцов, поэтому я пишу свой класс сущностей следующим образом:

@Entity
public class Blog {
    // ...

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "created_time", updatable = false, insertable = false, nullable = false,
        columnDefinition = "datetime default CURRENT_TIMESTAMP")
    private Date createdTime;

    @Temporal(TemporalType.TIMESTAMP)
    @Column(name = "modified_time", updatable = false, insertable = false, nullable = false,
        columnDefinition = "datetime default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
    private Date modifiedTime;
}

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

Однако, когда я проверяю возвращение сущности java на BlogRepository::save, значение этого двух столбцов не самая новая ценность. Например, когда я вставляю новую сущность Blog, я получаю значение NULL для этих двух свойств возвращаемого значения BlogRepository::save.

Я прочитал какой-то пост, такой как { ссылка } , поймите, что если я отмечу столбец как updatable = false, такая ситуация произойдет. Так как мне это исправить? Просто удалите updatable = false / insertable = false, похоже, ничего не поделаешь, но вызовет несоблюдение ограничения NULL для столбца. Но если я уберу ограничение not null для этих двух столбцов, значение этих двух столбцов будет просто нулевым.

1 Ответ

1 голос
/ 21 февраля 2020

В этом случае вы должны использовать аннотацию @ Generated .

2.3.18. Сгенерированные свойства

Сгенерированные свойства - это свойства, значения которых создаются базой данных. Как правило, приложениям Hibernate необходимо было обновить sh объекты, которые содержат любые свойства, для которых база данных генерировала значения. Пометка свойств как сгенерированных, однако, позволяет приложению делегировать эту ответственность Hibernate. Когда Hibernate выдает SQL INSERT или UPDATE для объекта, который определил сгенерированные свойства, он немедленно выдает выбор для извлечения сгенерированного значения.

Итак, вы должны исправить свое отображение примерно так:

@Temporal(TemporalType.TIMESTAMP)
@Generated(value = GenerationTime.INSERT)
@Column(name = "created_time", updatable = false, insertable = false, nullable = false,
        columnDefinition = "datetime default CURRENT_TIMESTAMP")
private Date createdTime;

@Temporal(TemporalType.TIMESTAMP)
@Generated(value = GenerationTime.ALWAYS)
@Column(name = "modified_time", updatable = false, insertable = false, nullable = false,
        columnDefinition = "datetime default CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
private Date modifiedTime;
...