2015-07-03 35 views
0

我想知道是否可以更改的主鍵值 Grails Domain類中的組合主鍵的值?例如,具有本領域:更新Grails的主鍵值gorm

class StudentHistory implements Serializable { 
    String studentNumber 
    String schoolYear 
    Integer yearLevel 
    String section 
    Float average 
    String status 

    static mapping = { 
     ... 
     id composite: ["studentNumber", "schoolYear", "yearLevel", "section"] 
     ... 
    } 
} 

令說,在schoolYear: "2014-2015",一定yearLevel: 1學生從section: "1D"section: "1N"studentNumber: "2011-488-MN-0"轉移部分。現在執行該記錄更新,我們做了service內類似的東西:

StudentHistory record = StudentHistory.find { 
    eq("studentNumber", "2014-488-MN-0") 
    eq("schoolYear", "2014-2015") 
    eq("yearLevel", 1) 
    eq("section", "1D") 
} 

record.setSection("1N") 

record.save(flush: true, insert: false) 

的問題是,在主鍵更新不生效,但是當我試圖更新其他非主要領域如averagestatus,更新它們可以正常工作(我試着直接在數據庫上執行SQL來確認)。我如何更新主鍵?


PS:現在,在此基礎上設計的,我知道有些人會認爲,爲什麼不只是創造另一個紀錄,然後就去拿已進入最後的記錄?但我需要做的是更新該複合主鍵


PPS:請不要建議上刪除舊的實例,並創建一個新的,複製除了section舊的細節。我不能這樣做,因爲許多表都連接到這張表。

+0

請您詳細說明:「主鍵更新不生效」。你如何確認它沒有生效?而且,你能否也請說上面的代碼是否在服務或控制器中。謝謝。 :) –

+0

@IStevenson我已經在主要和非主要字段中執行了更新(在服務內部),檢查數據庫是否有效。與更新非主字段相比,更新grails上的主字段不起作用。 – Gideon

回答

0

我相信這是一個不錯的做法,可以避免更改主鍵。主鍵是一個對象的唯一標識符,並且有效地改變它意味着創建一個新的對象。所以如果你的複合主鍵是可變的(或者可以改變),那麼你應該使用代理鍵 - 一個人爲的主鍵。同時,您可以在當前爲主鍵的4個字段上創建唯一約束。

你的情況,那就是:

static mapping = { 
    ... 
} 

static constraints = { 
    studentNumber(unique: ["schoolYear", "yearLevel", "section"]) 
} 

希望這是有道理的。