MySQL更新其他行以跟踪当前/最新

时间:2017-08-07 14:38:07

标签: mysql spring jpa

我正在使用内部网项目,所以我无法复制/粘贴代码,所以希望我的描述和一些小片段能够提供帮助。

我知道MySQL触发器无法做到这一点,但希望JPA PrePersist(或类似)方式干净(最小代码。)

我们的查询有点难看,因为我们似乎总是需要找到“最新的”。因此,如果我们有一个基于连接表的PersonCar实体,那么我们似乎需要找到person_id = x和car_id = y的最新行。所以我们考虑在我们的实体(和数据库表)中添加一个is_current标志。我们的选择是......

  1. 继续查询类似“where person_car_id =(从PersonCar中选择max(pc),其中person_id = x和car_id = y)”
  2. 用户获取最新人/车行的视图
  3. 添加is_current,其中最新的PersonCar行设置为true,false为 PersonCar关系的所有其他行。
  4. 我们想尝试#3。但是在MySQL中你不能做一个预触发来更新所有其他行,使用相同的person_id和car_id来更新is_current = false,然后再插入新行并指定is_current为真。

    所以,我正在研究一种JPA方式来做我们想要的事情。

    将进行更新的PrePersist:更新person_car set is_current = false其中person_id = same_person_id_as_current_insert,car_id = same_car_id为current_insert;

    请注意,我们确实使用来自UI的直接Spring Data存储库调用以及控制器调用。

    实现这一目标的最佳方式是什么?

    我希望有一个严格的注释方法来实现这一点,或者在实体的方法中添加类似JDBC的更新查询,并用@PrePersist或简单的东西注释它。但是,如果人们有充分的理由不以这种方式这样做,我也全都倾听。

1 个答案:

答案 0 :(得分:0)

不要在实体中使用isCurrent标志,而不是在PrePersist / PreUpdate方法中更新时间戳。然后在服务器端,您可以进行一些简单的DateTime比较,找出哪些对象是最新的。