Обновляемое ложное поведение - PullRequest
2 голосов
/ 06 мая 2010

Мне нужно, чтобы LastUpdatedDttm обновлялся SYSDATE при каждом обновлении записи. Но ниже аннотации не работают по желанию. SYSDATE вставляется только один раз и не обновляется для последующих обновлений. Кроме того, lastUpdDTTM не является частью sql, сгенерированной hibernate.

@Generated(GenerationTime.ALWAYS)
@Column(name="LAST_UPDATED_DTTM",insertable=false,updatable=true, columnDefinition ="timestamp default SYSDATE")
private Date lastUpdDTTM;

@Generated(GenerationTime.ALWAYS)
@Column(name="CREATED_DTTM", insertable=false, updatable=false)
private Date createdDTTM;

1 Ответ

0 голосов
/ 06 мая 2010

(...) SYSDATE вставляется только один раз и не обновляется для последующих обновлений.

Прежде всего, позвольте мне кое-что прояснить: Generated означает, что полегенерируется базой данных , и Hibernate должен прочитать ее после вставки / обновления, чтобы обновить сущность.Использование default SYSDATE в определении столбца прекрасно работает для INSERT, но для UPDATE вам понадобится триггер.

Кроме того, lastUpdDTTM не является частью sql, сгенерированной hibernate.

Ну, вы сказали Hibernate, что поле ALWAYS сгенерировано базой данных, поэтому я не удивлен, что Hibernate не включает его в сгенерированный SQL (на самом деле, я считаю, что это как-то конфликтует с udpatable = true, Я ожидаю, что Hibernate будет жаловаться на это).

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


Другой подход заключается в использовании аннотаций обратного вызова, например, для даты последнего обновления:

@PreUpdate
protected void updateDates() {
    lastUpdDTTM = new Date();
}

Для лучшей согласованности вы можете дажеиспользуйте тот же подход для даты создания с @PrePersit:

@PrePersist
@PreUpdate
protected void updateDates() {
    Date now = new Date();
    if (createdDTTM == null) {
        createdDTTM = new Date(now.getTime());
    }
    lastUpdDTTM = now;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...