我有一个名为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”的组合来检索实体,该组合是辅助密钥,而不是OrgUnit实体的主键字段“Id”。并且因为名称是一个被更改的字段,所生成的查询无法检索任何内容,提交无提示失败并且我根本没有例外。
以下是作为合并操作的一部分生成的数据库查询..
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会忽略主键并尝试根据辅助键检索实体。
任何想法都赞赏。
谢谢, 基肖尔马布
答案 0 :(得分:0)
Grails并没有试图找回这个。这是唯一的约束 - 保存前检查的“每个工作区的名称”。
看起来像save()毕竟失败了。它真的无声地失败了吗? mergedOu.hasErrors()怎么样?