【问题标题】:Howto update entity field automatically when some entity date field is in past compared to current date?与当前日期相比,当某人实体日期字段过去时如何自动更新实体字段?
【发布时间】:2019-02-14 06:37:31
【问题描述】:

我有一个包含以下字段的表格:

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

    private String status;

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

日期字段说明此条目的到期日期/时间,当当前日期/时间达到规定的到期日期时,状态应更新为“已过期”。

有没有一种设置到期的精细方法,而不是我使用定期计时器检查所有记录?

我正在使用 JpaRepository 和 PostgreSQL。

【问题讨论】:

    标签: java spring postgresql jpa


    【解决方案1】:

    除了轮询和更新之外,没有其他方法可以代表 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";
    

    上述方法的问题在于,上述更新仅在持久化或加载实体时触发。因此,如果您加载了一个未过期的实体并且它会在会话期间过期,您不会注意到它过期,直到它过期后第一次持续存在。

    【讨论】:

    • 对于你提到的第一个例子,究竟什么时候调用 getStatus()?我问这样我可以更好地预测状态何时会真正“更新/检查”,因为检查是在 getStatus() 方法内完成的。
    • @Cherple 当您需要了解状态时,应显式调用该方法。因此,就像您会查询字段状态,但不是提供 getter 来返回名为 status 的字段,而是创建方法来计算每次调用该方法时的状态。
    • 我明白了。所以从技术上讲,我希望实现的目标仍然是手动检查。我了解,只是想看看是否有某种我不知道的自动化可用哈哈..非常感谢!
    【解决方案2】:

    当您从 db 中选择数据时,您实际上可以计算此状态:

    SELECT date < NOW() as status FROM TableA;
    

    或在您的代码或数据库中创建 cron 作业以不时执行此操作。

    【讨论】:

      【解决方案3】:
      CREATE EVENT updateEvent
          ON SCHEDULE
            EVERY 3 HOUR
              DO
      update TableA 
      set status='Expired' 
      where date < date_sub(now(),interval 24 hour);
      

      您可以创建数据库事件,以便通过此事件每 3 小时更新一次状态。

      【讨论】:

        猜你喜欢
        • 2018-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-04
        • 1970-01-01
        相关资源
        最近更新 更多