我目前正在从事我的第一个Java项目,并跳入了使用spring / hibernate的工作。
我创建了一个API,用于在数据库上执行CRUD操作。我认为编写当前将项目添加到数据库的时间是个好主意。
为此,我在数据库中创建了一个新列,并使用一个名为“ timestamp”的新javafield更新了我要写入的实体,并将其映射到数据库列。
然后我使用(或尝试)下面的代码来使系统设置时间戳记,因为我正在执行类似的操作以确保ID在自动递增之前设置为0。 >
for (Downloads tempDownload : theDownloads) {
// display the download
tempDownload.setId(0);
tempDownload.setTimestamp(System.currentTimeMillis());
System.out.println(tempDownload);
// save to the database
downloadsService.saveProduct(tempDownload);
}
但是,当将项目写入db时,时间戳记将写为0。如果我删除
tempDownload.setTimestamp(System.currentTimeMillis());
然后我可以通过将JSON与有效负载手动传递来设置时间。还有另一种方法可以解决这个问题,否则我可能会缺少一个步骤?
亲切的问候,
丹尼
答案 0 :(得分:1)
由于您使用的是System#currentTimeMillis
,所以我想您用来写入时间戳的字段的类型为long
或Long
。
如果您想使用Hibernate将日期保存到字段中,建议您使用推荐的方式。
例如,如果您的情况是,您可以将timestamp
字段的类型为Date
,然后使用以下方案对其进行注释。
@Temporal(TemporalType.TIMESTAMP)
private Date timestamp;
然后您只需执行tempDownload.setTimestamp(new Date);
进行设置。
或者,您可以轻松地将Java 8的新的Date and Time API映射到数据库,即使不使用@Temporal
批注,因为它们会自动映射到它们各自的SQL类型。
考虑到这一点,映射方案为:
使用正确的日期持久性类型非常重要。您的示例仅保存毫秒,因为这些毫秒作为纪元返回。这意味着您需要执行从毫秒到当前的转换才能完成各种工作。此外,如果您想获取与时区相关的信息,则采用这种方法禁止类似的事情。