Отметка времени создания и отметка времени последнего обновления в Hibernate и MySQL - PullRequest
220 голосов
/ 21 октября 2008

Для определенного объекта Hibernate у нас есть требование хранить время его создания и время последнего обновления. Как бы вы спроектировали это?

  • Какие типы данных вы бы использовали в базе данных (предполагая MySQL, возможно, в другом часовом поясе, чем JVM)? Будут ли типы данных учитывать часовой пояс?

  • Какие типы данных вы бы использовали в Java (Date, Calendar, long, ...)?

  • Кого бы вы взяли на себя ответственность за установку меток времени - базы данных, инфраструктуры ORM (Hibernate) или разработчика приложений?

  • Какие аннотации вы бы использовали для сопоставления (например, @Temporal)?

Я ищу не только рабочее решение, но и безопасное и продуманное решение.

Ответы [ 14 ]

1 голос
/ 06 апреля 2019

Следующий код работал для меня.

package com.my.backend.models;

import java.util.Date;

import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.MappedSuperclass;

import com.fasterxml.jackson.annotation.JsonIgnore;

import org.hibernate.annotations.ColumnDefault;
import org.hibernate.annotations.CreationTimestamp;
import org.hibernate.annotations.UpdateTimestamp;

import lombok.Getter;
import lombok.Setter;

@MappedSuperclass
@Getter @Setter
public class BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    protected Integer id;

    @CreationTimestamp
    @ColumnDefault("CURRENT_TIMESTAMP")
    protected Date createdAt;

    @UpdateTimestamp
    @ColumnDefault("CURRENT_TIMESTAMP")
    protected Date updatedAt;
}
1 голос
/ 21 октября 2008

Возможно, вы захотите сохранить время как в формате DateTime и в формате UTC. Обычно я использую DateTime вместо Timestamp из-за того, что MySql преобразует даты в UTC и обратно в местное время при хранении и получении данных. Я бы предпочел хранить любую такую ​​логику в одном месте (бизнес-уровень). Я уверен, что есть и другие ситуации, когда использование Timestamp предпочтительнее.

1 голос
/ 21 октября 2008

В качестве типа данных в JAVA я настоятельно рекомендую использовать java.util.Date. Я столкнулся с довольно неприятными проблемами с часовым поясом при использовании Календаря. Смотрите это Тема .

Для установки меток времени я бы порекомендовал использовать либо подход AOP, либо вы можете просто использовать триггеры на столе (на самом деле это единственное, что я когда-либо считаю приемлемым для использования триггеров).

0 голосов
/ 24 июня 2017

У нас была похожая ситуация. Мы использовали Mysql 5.7.

CREATE TABLE my_table (
        ...
      updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    );

Это сработало для нас.

...