2014-01-09 63 views
2

@Id属性一般具有自动生成数据库主键ID的能力。 我想有一个时间戳是Id(我可以确保不会有2个相同的时间戳)。为数据库自动生成时间戳为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; 
    } 
} 

你会选择什么,为什么?

+0

一方面,Java只使用毫秒作为时间戳;大多数数据库默认为纳秒(或仅秒) - 在app/db之间有不匹配是失去某种东西的好方法。如果您突然收到很多请求,则通过时间戳将数据库限制为id是限制数据库吞吐量的好方法。使用时间戳记录日期/时间信息。使用一个id(通常是整数)来唯一标识行。 –

回答

2

我不会那样做,使用时间戳作为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; 
}