[英]Howto update entity field automatically when some entity date field is in past compared to current date?
我有一个包含以下字段的表:
@Entity
public class TableA{
@Temporal(TemporalType.TIMESTAMP)
private Date date;
private String status;
public TableA() {
}
//Setter and getter methods
}
日期字段说明此条目的到期日期/时间,当当前日期/时间达到规定的到期日期时,状态应更新为“已到期”。
是否有一种完善的方法来设置此到期时间,而不是使用定期计时器来检查所有记录?
我正在使用JpaRepository和PostgreSQL。
除了轮询和更新之外,没有其他方法可以代表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";
上述方法的问题在于,仅当持久化或加载实体时才触发上述那些更新。 因此,如果您将加载一个未过期的实体,并且该实体在会话期间会过期,那么您将不会注意到它已过期,直到它在过期后第一次持续存在。
CREATE EVENT updateEvent
ON SCHEDULE
EVERY 3 HOUR
DO
update TableA
set status='Expired'
where date < date_sub(now(),interval 24 hour);
您可以创建数据库事件,以便通过此事件每3小时更新一次状态。
当您从db中选择数据时,实际上可以计算此状态:
SELECT date < NOW() as status FROM TableA;
或在您的代码或数据库中创建cron作业以不时地执行该操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.