жесткая настройка времени сгенерированного с помощью спящих аннотаций JPA - PullRequest
17 голосов
/ 13 ноября 2009

спасибо вам, ребята, мой ноу-хау в спящем режиме значительно улучшилось. Теперь я попал в блок о current_timestamp. вот мои коды

@Column(name="DATE_CREATED", insertable=false, updatable=false, columnDefinition="timestamp default current_timestamp")
@org.hibernate.annotations.Generated(value=GenerationTime.INSERT)
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date dateCreated;

@Column(name="LAST_MODIFIED", insertable=false, updatable=false, columnDefinition="datetime")
@org.hibernate.annotations.Generated(value=GenerationTime.ALWAYS)
@Temporal(javax.persistence.TemporalType.TIMESTAMP)
private Date lastModified;

Я хочу, чтобы date_created получил current_timestamp, и я хочу, чтобы lastmodified вставлял время для каждого обновления. Очевидно, я не могу иметь 2 поля current_timestamp в одной таблице. спасибо за чтение

Ответы [ 2 ]

48 голосов
/ 13 ноября 2009

Это не связано с Hibernate как таковым. Ваши аннотации, как указано выше, сообщают Hibernate о том, что значения будут сгенерированы базой данных и, следовательно, должны быть перезагружены после вставки / обновления сущности.

Если вы хотите именно этого, вам необходимо настроить базу данных (например, путем создания триггера) для заполнения столбцов date_created / last_modified по мере необходимости.

Другой подход состоит в том, чтобы не отмечать эти поля как сгенерированные, а вместо этого обновлять их в своем коде Java. Если вы используете JPA (через Hibernate EntityManager), это довольно просто сделать с помощью @ PrePersist / @ PreUpdate метода обратного вызова:

@PreUpdate
@PrePersist
public void updateTimeStamps() {
    lastModified = new Date();
    if (dateCreated==null) {
      dateCreated = new Date();
    }
}
1 голос
/ 01 октября 2018

Вы можете достичь того же с помощью спящих @CreationTimestamp и @UpdateTimestamp аннотаций, например

@Column(name = "CREATED")
@CreationTimestamp
private LocalDateTime created;

@Column(name = "LAST_UPDATED")
@UpdateTimestamp
private LocalDateTime lastUpdated;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...