两个选择查询而不是插入前的一个查询

时间:2013-08-29 11:59:44

标签: hibernate grails gorm

我正在使用grails 2.2.2并且我创建了一个具有一个唯一String属性的域类:

class Myclass {
    String dscr // my String attibute

    static constraints = {
        dscr unique: true // the code to set it unique
    }
}

然后我运行grails控制台命令来测试这个简单的类,使用以下代码和loggingSql = true来查看生成的查询:

def a = new Myclass([dscr:'dscr1'])
a.save()

结果查询如下:

Hibernate: select this_.id as id0_0_, this_.version as version0_0_, this_.dscr as dscr0_0_ from myclass this_ where this_.dscr=?
Hibernate: select this_.id as id0_0_, this_.version as version0_0_, this_.dscr as dscr0_0_ from myclass this_ where this_.dscr=?
Hibernate: insert into myclass (version, dscr) values (?, ?)

这里的谜团是两个选择查询而不是一个。我发现here的一个查询的原因是,选择查询是为了检查唯一性。为什么第二次选择会发生?

1 个答案:

答案 0 :(得分:1)

毕竟,我找不到两个选择查询的逻辑解释。我发现最好的是在没有手动更改数据库的情况下摆脱这两个选择,如here所述。

因此,为了摆脱这些选择,有人应该首先以不同的方式设置域类(没有约束,但是使用映射)。

class Myclass {
    String dscr

    static mapping = {
        dscr unique: true
    }
}

然后为了保护你的代码免受异常的影响,因为现在hibernate没有检查唯一性,你应该插入这样的新元素:

try {
    def a = new Myclass([dscr:'dscr1'])
    a.save()
} catch(e) {
    Myclass.withSession { session ->
        session.clear()
    }

    // do whatever you want to handle a possible exception
}

现在生成的查询只是一个导入查询,可以成功运行或不运行。

Hibernate: insert into myclass (version, dscr) values (?, ?)