2017-08-07 47 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