Как автоматически обновить поле объекта, если какое-либо поле даты объекта было в прошлом по сравнению с текущей датой? - PullRequest
0 голосов
/ 14 февраля 2019

У меня есть таблица со следующими полями:

@Entity
public class TableA{
    @Temporal(TemporalType.TIMESTAMP)
    private Date date;

    private String status;

    public TableA() {
    }
    //Setter and getter methods
}

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

Есть ли улучшенный способ установки этого срока вместо меня, используя периодический таймер для проверки всех записей?

Я использую JpaRepository и PostgreSQL.

Ответы [ 3 ]

0 голосов
/ 14 февраля 2019

Вы на самом деле можете рассчитать этот статус, когда выбираете свои данные из db:

SELECT date < NOW() as status FROM TableA;

Или создаете работу cron в своем коде или базе данных, чтобы делать это время от времени.

0 голосов
/ 14 февраля 2019

Нет средств для автоматического обновления от имени JPA или других технологий, кроме опроса и обновления.Тем не менее, ваш статус должен быть методом, который вычисляет статус (вместо поля), например:

public String getStatus() {
    if(date.before(new Date())) return "expired";
    return ""; // or what ever are statuses
}

Кроме того, вы должны собирать статусы как enum значения.

С JPA вы можетеконечно, используйте @PrePersist & @PostLoad при извлечении или сохранении в дБ, например:

@PrePersist // benefit of this would be marginal since usually you do not deal 
            // much with entity after persisting
@PostLoad
private void updateStatus() {
    if(date.before(new Date())) status = "expired";

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

0 голосов
/ 14 февраля 2019
CREATE EVENT updateEvent
    ON SCHEDULE
      EVERY 3 HOUR
        DO
update TableA 
set status='Expired' 
where date < date_sub(now(),interval 24 hour);

Вы можете создать событие базы данных для обновления статуса каждые 3 часа этим событием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...