通过时间戳创建,是让数据库管理它更好,还是让应用程序管理它更好?

问题描述 投票:0回答:4

我们正在开发您的沼泽标准 Java 应用程序,并且我们正在创建的许多记录(MySQL 中的 Hibernate 实体)都具有“创建”和“修改”时间戳。

现在,我和一位开发人员不同意 - 我相信这两个字段都应该有 MySQL 默认值 CURRENT_TIMESTAMP,然后应用程序可以更改修改的值。他希望两者都由应用程序管理。

这两个决定是否有令人信服的理由?我不明白为什么你想在代码中添加更明确的步骤,除非出于某种原因你担心你的服务器(数据库,应用程序)具有不一致的时间戳。

java mysql hibernate orm
4个回答
7
投票
  • 如果可以牺牲可移植性,请使用数据库时间戳。此外,如果非常的微小差异对应用程序很重要,并且您将拥有多个应用程序服务器/集群,那么您可能会在同步节点时遇到问题。
  • 使用应用程序生成时间戳,以防不确定所选数据库是否会保留,或者如果您正在使用多个数据库 - 例如用于生产的 MySQL,用于单元测试的 HSQLDB。

如果这些参数都不适用,请使用对您来说更容易的参数(或更多开发人员投票支持的参数)。

如果您要进行应用程序处理,请使用

@PreUpdate
寻求 Pascal Thivent 的建议,或者为您的字段设置默认值,例如:

private Calendar date = Calendar.getInstance();

4
投票

我会从代码中处理这个问题并使用 Hibernate/JPA 的 @PrePersist@PreUpdate 回调:

@PreUpdate
@PrePersist
public void setTimeStamps() {
    modified = new Date();
    if (created==null) {
      created = new Date();
    }
}

主要原因:可移植性(即这将与另一个数据库一起使用,例如在测试环境中,没有任何数据库魔法,没有

DEFAULT
,没有触发器,什么都没有)。


3
投票

为了一致性,将所有时间戳分配在同一层中是有意义的。

相关问题的answer给出了如何在 Hibernate 中执行此操作的一个很好的示例。


-1
投票

我会使用触发器和存储过程来维护这些字段。所以把逻辑放在数据库中。

© www.soinside.com 2019 - 2024. All rights reserved.