我有一个简单的 MySql 表,如下所示,我只想将“data”字段发布到 Spring Data Rest 存储库,并自动添加“web_order_id”和“date_added”字段:
CREATE TABLE `web_order` (
`web_order_id` int(11) NOT NULL AUTO_INCREMENT,
`date_added` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`data` text NOT NULL,
PRIMARY KEY (`web_order_id`)
) ENGINE=InnoDB
WebOrder 实体是通过 Hibernate 逆向工程生成的,并将“web_order_id”和“date_add”字段输出为:
@Id
@Column(name="web_order_id", unique=true, nullable=false)
public int getWebOrderId() {
return this.webOrderId;
}
public void setWebOrderId(int webOrderId) {
this.webOrderId = webOrderId;
}
@Temporal(TemporalType.TIMESTAMP)
@Column(name="date_added", nullable=false, length=19)
public Date getDateAdded() {
return this.dateAdded;
}
public void setDateAdded(Date dateAdded) {
this.dateAdded = dateAdded;
}
这是 WebOrderRepo:
@RepositoryRestResource(path="webOrder",collectionResourceRel = "webOrder")
public interface WebOrderRepo extends CrudRepository<WebOrder,Integer> {
}
问题是当我将以下 JSON 正文发布到 WebOrderRepo 时:
{
"data": "{\"value\":\"some long escaped JSON string\"}"
}
数据库中的 date_added 列设置为 NULL,并且 web_order_id 正在正确递增。我已经检查过数据库中确实如此,这是来自 SDR 的 JSON 响应:
{
"webOrderId": 0,
"dateAdded": null,
"data": "{\"value\":\"some long escaped JSON string\"}",
"_links": {
"self": {
"href": "http://localhost:8080/sdr/v1/webOrder/0"
},
"webOrder": {
"href": "http://localhost:8080/sdr/v1/webOrder/0"
}
}
}
我可以在数据库中看到,每次插入时 web_order_id 都会递增,没有一个 ID = 0,但 SDR 在每次插入上返回 web_order_id = 0(而不是新创建的行的 ID)。我还可以看到 date_added 为 NULL,而不是自动设置。
- 为什么时间戳不默认为 NOW()?
- 为什么返回结果显示 ID = 0,而不是数据库中的行 ID?
MySql 5.5 文档声明:
By default, TIMESTAMP columns are NOT NULL, cannot contain NULL values, and assigning NULL assigns the current timestamp.
我不明白为什么没有插入日期,或者如何取回正确的 ID。即使我在 JSON 中 POST dateAdded = null 它也不会自动分配。
最佳答案
尝试将 @GenerateValue
添加到您的 webOrderId
字段,并将 @CreatedDate
添加到 dateAdded
字段。我还将这些字段设置为只读,就像它们应该的那样。
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name="web_order_id", unique=true, nullable=false)
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private int webOrderId;
@Temporal(TemporalType.TIMESTAMP)
@Column(name="date_added", nullable=false, length=19)
@CreatedDate
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Date dateAdded;
关于java - Spring 数据休息: Default Timestamp Fails and ID returns 0,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59630198/