【问题标题】:Spring Data Rest: Default Timestamp Fails and ID returns 0Spring Data Rest:默认时间戳失败,ID 返回 0
【发布时间】: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


【解决方案1】:

尝试将@GeneratedValue 添加到您的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;

【讨论】:

    猜你喜欢
    • 2013-10-08
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-14
    • 1970-01-01
    • 1970-01-01
    • 2017-10-18
    相关资源
    最近更新 更多