У меня есть сущность с именем OrgUnit, определенная следующим образом
class OrgUnit {
String name
String description
.....
.....
static belongsTo = [workSpace:WorkSpace]
static constraints = {
//enforce uniqueness of the OrgUnit Name within a WS.
name(nullable: false, blank: false, unique: 'workSpace')
address(nullable:true)
}
...
...
}
В моем классе обслуживания ..
def updateOrgUnit(OrgUnit orgUnit) {
//The DB query generated by GORM here is wrong...
OrgUnit mergedOu = OrgUnit.merge(orgUnit);
try
{
if (!mergedOu.save(flush:true)) {
mergedOu.errors.allErrors.each{error ->
println "An error occured while saving 'orgUnit': ${error}"
errorMsg = "Exception occurred while executing updateOrgUnit()";
}
}
}
catch (Exception exc)
{
exc.printStackTrace();
}
}
Имя OrgUnit, которое я пытаюсь обновить, изменилось.
Похоже, довольно простое обновление, но оно не работает. Причина в том, что в рамках слияния Grails пытается извлечь сущность на основе комбинации «OrgUnit Name + WorkSpace Id», которая является вторичным ключом, а не полем первичного ключа «Id» сущности OrgUnit. И поскольку имя - это одно поле, которое изменяется, сгенерированный запрос не может получить что-либо, фиксация завершается сбоем молча, и я вообще не получаю исключения.
Вот запрос к БД, сгенерированный как часть операции слияния.
select this_.id as id18_0_, this_.version as version18_0_, this_.address_id as address3_18_0_, this_.archive as archive18_0_, this_.name as name18_0_, this_.org_hierarchy_version as org14_18_0_,......this_.type as type18_0_, this_.work_space_id as work19_18_0_, this_.zoom as zoom18_0_ from org_unit this_ where this_.name=? and this_.work_space_id=?
Я не уверен, почему Grails игнорирует первичный ключ и пытается извлечь объект на основе вторичного ключа.
Любые идеи приветствуются.
Спасибо,
Кишор