【发布时间】:2020-01-07 14:17:02
【问题描述】:
我有一个简单的 MySql 表,如下所示,我只想将“数据”字段发布到 Spring Data Rest repo,并自动添加“web_order_id”和“date_add”字段:
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_added”字段输出为:
@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,而不是 DB 中的行 ID?
MySql 5.5 文档状态:
默认情况下,TIMESTAMP 列不是 NULL,不能包含 NULL 值,分配 NULL 分配当前时间戳。
我不知道为什么没有插入日期,或者如何取回正确的 ID。即使我在 JSON 中 POST dateAdded = null 它也不会自动分配。
【问题讨论】:
-
为上面的 JSON 添加你的控制器类
-
这是Spring Data Rest,WebOrderRepo(提供)是Controller(RepositoryRestResource)。
-
看起来你在 getter 上有注释,它们应该设置在实际的变量声明中
-
感谢您的评论。我觉得这样就OK了。这就是 hbm2java 在逆向工程过程中创建实体的方式。它在其他实体中运行良好。
标签: java mysql spring hibernate spring-data-rest