2017-08-07 50 views
0

我正在一个Intranet项目,所以我不能复制/粘贴代码,所以希望我的描述,也许一些小片段将有所帮助。MySQL更新其他行以跟踪当前/最新

我知道MySQL的触发器不能做到这一点,但希望一个JPA PrePersist(或类似)的方式,是干净的(最少的代码。)

我们是那种丑陋的查询,因为我们似乎需要一直找到“最新”。所以如果我们有一个基于连接表的PersonCar实体,那么我们似乎需要用person_id = x和car_id = y来查找最近的行。所以我们在考虑增加一个is_current标志,我们的实体(和数据库表。)我们的选择是......有疑问

  1. 守在那里像“,其中person_car_id =(选择PersonCar最大(PC),其中为person_id = x和car_id = Y)”
  2. 用户为了获得最新的人/车排
  3. 添加具有最新PersonCar行设置为true和false为 PersonCar关系的所有其他行is_current。

我们想尝试#3。但是在MySQL中,在插入新行并指定is_current为true之前,您无法使用相同的person_id和car_id更新其他所有行,以使其具有is_current = false。

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

将执行更新的PrePersist:update 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或其他简单的方法对它进行注释。而且,如果人们有充分的理由不这样做,我也会全力倾听。

回答

0

而不是在您的实体中具有当前标志为什么没有在PrePersist/PreUpdate方法中更新的时间戳。然后在服务器端,可以进行一些简单的DateTime比较,以找出哪些对象是最新的。

+0

这基本上是我们现在所做的,它使每个查询必须有额外的内容来确定哪个是最大值。我们实际上使用了max(primary_key),即使我们在每个对象中也有一个create_date。只是在我们一些复杂的联接中,只需添加到where子句“and is_current = true”似乎更好, – user2052618