два выбирают запросы вместо одного перед вставкой

Я использую 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 (?, ?)

Загадка здесь - два запроса select вместо одного. Причина одного запроса, как я обнаружил, здесь, заключается в том, что запрос выбора выполняется для проверки уникальности. Почему происходит второй выбор?


person wannaKnowItAll    schedule 29.08.2013    source источник


Ответы (1)


В конце концов, я не мог найти логического объяснения двум запросам на выборку. Лучшее, что я нашел, - это избавиться от этих двух выборок без ручного изменения базы данных, как сказано в здесь.

Итак, чтобы избавиться от этих выборок, кто-то должен сначала установить класс предметной области другим способом (без ограничений, но с отображением).

class Myclass {
    String dscr

    static mapping = {
        dscr unique: true
    }
}

А затем, чтобы защитить свой код от исключений, поскольку теперь спящий режим не проверяет уникальность, вам следует вставить новые элементы, например:

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 (?, ?)
person wannaKnowItAll    schedule 30.08.2013