Grails - 二级密钥问题

时间:2011-03-10 20:13:23

标签: grails

我有一个名为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会忽略主键并尝试根据辅助键检索实体。

任何想法都赞赏。

谢谢, 基肖尔马布

1 个答案:

答案 0 :(得分:0)

Grails并没有试图找回这个。这是唯一的约束 - 保存前检查的“每个工作区的名称”。

看起来像save()毕竟失败了。它真的无声地失败了吗? mergedOu.hasErrors()怎么样?