对于某个Hibernate实体,我们需要存储它的创建时间和最后一次更新时间。你会怎么设计呢?
您将在数据库中使用什么数据类型(假设MySQL,可能位于与JVM不同的时区)?数据类型是否支持时区? 你会在Java中使用什么数据类型(日期,日历,长,…)? 您会让谁负责设置时间戳——数据库、ORM框架(Hibernate)还是应用程序程序员? 你会为映射使用什么注释(例如@Temporal)?
我不仅在寻找一个可行的解决方案,而且在寻找一个安全、设计良好的解决方案。
对于某个Hibernate实体,我们需要存储它的创建时间和最后一次更新时间。你会怎么设计呢?
您将在数据库中使用什么数据类型(假设MySQL,可能位于与JVM不同的时区)?数据类型是否支持时区? 你会在Java中使用什么数据类型(日期,日历,长,…)? 您会让谁负责设置时间戳——数据库、ORM框架(Hibernate)还是应用程序程序员? 你会为映射使用什么注释(例如@Temporal)?
我不仅在寻找一个可行的解决方案,而且在寻找一个安全、设计良好的解决方案。
当前回答
使用Olivier的解决方案,在更新语句期间,您可能会遇到:
com.mysql.jdbc.exceptions.jdbc4。MySQLIntegrityConstraintViolationException:列“created”不能为空
要解决这个问题,在"created"属性的@Column注释中添加updatable=false:
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created", nullable = false, updatable=false)
private Date created;
其他回答
你可以使用@CreationTimestamp和@UpdateTimestamp:
@CreationTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "create_date")
private Date createDate;
@UpdateTimestamp
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "modify_date")
private Date modifyDate;
您可以考虑将时间存储为DateTime,并且使用UTC。我通常使用DateTime而不是Timestamp,因为MySql在存储和检索数据时将日期转换为UTC和本地时间。我宁愿把所有这些逻辑都放在一个地方(业务层)。我相信在其他情况下使用时间戳更可取。
只是强调一下:java.util. calendar不是用于时间戳的。date是指时间上的某一刻,不受时区等区域性事物的影响。大多数数据库以这种方式存储数据(即使它们看起来不是这样;这通常是客户端软件中的时区设置;数据是好的)
使用Olivier的解决方案,在更新语句期间,您可能会遇到:
com.mysql.jdbc.exceptions.jdbc4。MySQLIntegrityConstraintViolationException:列“created”不能为空
要解决这个问题,在"created"属性的@Column注释中添加updatable=false:
@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created", nullable = false, updatable=false)
private Date created;
我们也遇到过类似的情况。我们使用的是Mysql 5.7。
CREATE TABLE my_table (
...
updated_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
这对我们很管用。