Как использовать "при обновлении CURRENT_TIMESTAMP" в базе данных H2 с JUnit?

Я хочу, чтобы моя сущность имела временную метку модификации всякий раз, когда она обновляется. mysql поддерживает это, используя следующее определение:

@Entity
public class MyTable {
    @Column(columnDefinition = "TIMESTAMP default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP")
    private LocalDateTime thetime;
}

Проблема: в моих тестах JUnit я хочу использовать встроенную базу данных inmemory H2. И H2 не поддерживает on update CURRENT_TIMESTAMP.

Вопрос: как я могу сохранить определение столбца (как я буду запускать mysql во всех случаях, кроме автоматизированных тестов)? И как я могу обойти это в своем тестировании h2?

Ответы

Ответ 1

Официальное выражение от H2 заключается в том, что он не поддерживается, и обходной путь должен создать триггер. Вы можете прочитать это здесь https://github.com/commandos59/h2database/issues/491

Что бы вы ни указали в "columnDefinition", оно зависит от поставщика. И поскольку вы уже сопоставили свою сущность с этим определением столбца, вы не оставляете себе много места для маневра.

Есть несколько вещей, которые вы можете сделать. Некоторые из них взломаны.

  1. Смешайте конфигурацию XML для тестов. Конфигурация XML сущностей имеет более высокий приоритет, чем аннотации, поэтому вы можете переопределить определение столбца, специфичное для H2.

@Column (columnDefinition = "TIMESTAMP по умолчанию CURRENT_TIMESTAMP при обновлении CURRENT_TIMESTAMP") личное LocalDateTime thetime

  1. Альтернативой Agnostic of Database является оставить ваше время генерации на уровне сервера приложений и подключить его к слушателям @PrePersist @PreUpdate на объекте.

  2. Если временная метка должна быть сгенерирована базой данных, вы можете сделать что-то похожее на то, как генерируются идентификаторы. Имейте какой-то выделенный объект, который читает CURRENT_TIMESTAMP из базы данных и помещает его в сущность прямо перед тем, как вы сохранитесь, обновите.