Spring Data Rest: временная метка по умолчанию не работает и ID возвращает 0 - PullRequest
1 голос
/ 07 января 2020

У меня есть простая таблица 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 Reverse Engineering и выводит поля '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 увеличивается должным образом. Я проверил, что это верно в БД, и это ответ JSON от SDR:

{
  "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 для каждой вставки (вместо идентификатора вновь созданной строки). Я также вижу, что date_added имеет значение NULL, а не задается автоматически.

  • Почему для отметки времени не задано значение NOW ()?
  • Почему возвращаемое значение показывает ID = 0, а не идентификатор строки в БД?

Состояние документов MySql 5.5:

По умолчанию столбцы TIMESTAMP НЕ ПУСТО (NULL) и не могут содержать Значения NULL, а назначение NULL назначает текущую временную метку.

Я не могу понять, почему дата не вставляется или как вернуть правильный идентификатор. Даже если я POST dateAdded = null в JSON, он не назначается автоматически.

1 Ответ

0 голосов
/ 24 января 2020

Попробуйте добавить @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;
...