ON UPDATE CURRENT_TIMESTAMP и JPA - PullRequest
7 голосов
/ 06 июля 2011

У меня есть объект с полями

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "edit_timestamp", 
        columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
private Date editTimestamp;

@Version
@Column(name = "edit_count")
private short editCount;

private String text;

Когда я пытаюсь обновить с помощью Spring-Data-JPA , я вижу, что edit_count увеличен, но edit_timestamp по-прежнему остается прежним.Если я вручную вызываю SQL

UPDATE post SET TEXT='456' WHERE post_id=1;

, edit_timestamp обновляется.Если я добавлю

@PreUpdate
protected void onUpdate() {
    editTimestamp = new Date();
}

, это работает без проблем.У меня вопрос, почему без @PreUpdate edit_timestamp не обновляется?

Ответы [ 2 ]

8 голосов
/ 02 сентября 2012

Это старый вопрос, но я подумал, что я добавлю ответ, если кто-то еще посчитает его полезным.Я думаю, что вам нужно изменить аннотацию столбца, чтобы включить updatable = false.Это приведет к тому, что столбец edit_timestamp не будет отображаться в обновлении sql, поэтому поставщик JPA не будет включать текущее значение поля, из-за которого он переопределяет значение по умолчанию.

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "edit_timestamp", 
        updatable = false
        columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP")
private Date editTimestamp;
0 голосов
/ 06 июля 2011

Поскольку в вашем начальном наборе аннотаций все, что вы сказали ему о столбце edit_timestamp, это то, что это временная метка;JPA не знает, что ему нужно обновить.Я предполагаю, что когда вы вручную выполняете оператор SQL, у вас есть какой-то триггер при обновлении, который изменяет эти поля для вас - но перезаписывается данными, поступающими от персистентного объекта, когда вы обновляете его.
Если вам не нужны «отредактированные» счетчики / временные метки, попробуйте удалить их из сущности и посмотреть, работает ли это.В противном случае у вас есть рабочее решение.

...