3

私は grails 2.2.2 を使用しており、一意の String 属性を 1 つ持つドメイン クラスを作成しました。

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 (?, ?)

ここで謎なのは、選択クエリが 1 つではなく 2 つあることです。ここで見つけたように、1 つのクエリの理由は、一意性を確認するために選択クエリが作成されるためです。2 番目の選択が発生するのはなぜですか?

4

1 に答える 1

1

結局、2 つの選択クエリの論理的な説明を見つけることができませんでした。私が見つけた最良の方法は、ここで述べたように、データベースを手動で変更せずにこれら 2 つの選択を取り除くことです。

したがって、これらの選択を取り除くには、最初に別の方法でドメイン クラスを設定する必要があります (制約なしで、マッピングあり)。

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
}

結果のクエリは 1 つのインポート クエリだけになり、正常に実行される場合と実行されない場合があります。

Hibernate: insert into myclass (version, dscr) values (?, ?)
于 2013-08-30T08:49:16.943 に答える