java - Spring 数据休息: Default Timestamp Fails and ID returns 0

标签 java mysql spring hibernate spring-data-rest

我有一个简单的 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/

相关文章:

java - 如何通过反射但使用依赖注入(inject)创建对象?

java - 非 Java JVM 语言 - Java 语言未利用的任何特定 JVM 功能

java - 如何在mysql for java中创建存储过程?

mysql - Liquibase(changeLogSync,update,changeLogSyncSQL)不建表不插入数据

php - UTF-8贯穿始终

java - Spring 不提供 html 文件

spring - 如何在Grails中搜索多个数据库

java - 有没有一种好方法将文档监听器添加到动态创建的 JTextField

java - Spring Boot 中的 RequestMapping 不起作用

java - 使用 onPostExecute 设置全局数组值时出现问题