2015-07-03 7 views
0

Мне интересно, могу ли я изменить значение первичный ключ член составного первичного ключа в классе класса Grails? Например, имеющих этот домен:Обновление значения первичного ключа в 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 студента с studentNumber: "2011-488-MN-0" переданного участка от section: "1D" к section: "1N". Теперь, чтобы выполнить это обновление записи, мы делаем что-то подобное внутри 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) 

Проблема заключается в том, что обновление первичного ключа не вступает в силу, но когда я пытался обновить другие несырьевые поля, такие как average и status, обновление их работает нормально (я попытался выполнить SQL непосредственно в базе данных для подтверждения). Как я могу обновить первичные ключи?


PS: Теперь, на основании этой конструкции, я знаю, что некоторые предполагают, что почему бы не просто создать еще одну запись, то просто принести запись, которая была последней введенной? Но то, что мне нужно - , - это обновить этот составной первичный ключ.


PPS: Пожалуйста, не предложить на удаление старого экземпляра, и создать новый, копируя старые детали для section кроме. Я не могу этого сделать, поскольку многие таблицы подключены к этой таблице.

+0

Не могли бы вы уточнить: «обновление первичного ключа не вступает в силу». Как вы подтверждаете, что он не вступил в силу? И не могли бы вы также сказать, является ли вышеуказанный код службой или контроллером. Благодарю. :) –

+0

@IStevenson Я выполнил обновление (внутри службы) в первичных и не первичных полях, проверяя БД, если он работает. Обновление первичного поля на grails не работает, по сравнению с обновлением не первичного поля. – Gideon

ответ

0

Я считаю, что рекомендуется избегать изменения первичных ключей. Первичный ключ - это уникальный идентификатор объекта и его эффективное изменение означает создание нового объекта. Поэтому, если ваш составной первичный ключ изменен (или может мутировать), вы должны использовать суррогатный ключ - искусственный первичный ключ. В то же время вы можете создать уникальное ограничение для 4 полей, которые в настоящий момент являются вашим основным ключом.

В вашем случае это будет:

static mapping = { 
    ... 
} 

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

Надеется, что это имеет смысл.

Смежные вопросы