自动生成时间戳作为数据库ID?

3

@Id属性通常具有自动生成数据库主键ID的功能。

我希望在@Id中添加一个时间戳(我可以确保不会有两个相同的时间戳)。

您是将时间戳直接设置为变量的属性,还是在构造函数内初始化,或者作为参数传递给构造函数?

@Entity
public class MyDomain implements Serializable {
    @Id
    private Timestamp timestamp = new Timestamp(new Date().getTime());

    public MyDomain() {
        this.timestamp = new Timestamp(new Date().getTime());
    }

    public MyDomain(Timestamp timestamp) {
        this.timestamp = timestamp;
    }
}

你会选择什么,为什么?

1
首先,Java只使用毫秒作为时间戳;大多数数据库默认使用纳秒(或仅秒)- 应用程序/数据库之间存在不匹配是丢失数据的好方法。如果您突然收到大量请求,则将数据库限制为按时间戳排序的ID是限制数据库吞吐量的好方法。使用时间戳记录日期/时间信息。使用ID(通常为整数)唯一标识行。 - Clockwork-Muse
2个回答

4
我不会这样做,使用时间戳作为ID。id字段根本不应该有任何业务价值(至少在我目前的经验中),我会添加另一个时间戳行。但这只是我的意见。

1
我建议不要使用时间戳作为主键,因为它在作为唯一列时很笨拙。如果你真的想在其他表中使用这样一个繁琐的字段作为外键吗?如果这个时间戳确实需要是唯一的,那么最好将时间戳放在自己的字段中,并使用唯一约束。
@Entity
@Table(uniqueConstraints={@UniqueConstraint(columnNames={"timestamp"})})
public class MyDomain implements Serializable {

  @Id
  @Column(name = "id")
  private Long id;

  @Column(name = "timestamp")
  public Timestamp timestamp;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接