0

UserBankの 2 つのドメイン クラスの間に関係があります。user には多数の bank があり、bank には多数のユーザーmm_user_banksがいて、MM 関係の両方のテーブル ID を保持する結果テーブルと呼びます。

class User {

    String name
    String password
    Date createdAt = new Date()
    Date loginAt

    static hasMany = [banks:Bank]

    static fetchMode = [banks: 'eager']

    static constraints = {
    }

    static mapping = {
        banks joinTable: [name: 'mm_user_banks', key: 'mm_user_id']
    }
}

そして銀行...

class Bank {

    Long id
    String name

    static belongsTo = User
    static hasMany = [users:User]

    static constraints = {
    }

    static mapping = {
        id generator: 'assigned'
        users joinTable: [name: 'mm_user_banks', key: 'mm_bank_id'], lazy: false
    }
}

mm_user_banks銀行を使用してユーザーを保存することもできますが、問題は、ユーザー インスタンスから銀行リストを取得しようとすると、テーブルにこのユーザーの行が複数ある場合でも、1 行しかフェッチされないことです。

例えば:

User u = new User(name: 'user', password: 'pwd')
u.addToBanks(Bank.findById(1))
u.addToBanks(Bank.findById(2))
u.addToBanks(Bank.findById(3))

u.save(flush: true)

データベースでは問題なく 3 行を取得できますが、ユーザーを取得してその銀行リストを確認すると、次のようになります。

def user = User.findById(1) //OK

println "Size ${user.banks?.size()}" //only 1??? How?

前もって感謝します!

4

3 に答える 3

0

テストしたばかりです。「user.banks?.size()」は「3」を返します。DB内のデータに問題がないことを確認しますか?

とにかく、コレクションに熱心なフェッチを使用する場合は、(「fetchMode」静的フィールドの代わりに)Userクラスの「mapping」で定義します。

static mapping = {
    banks joinTable: [name: 'mm_user_banks', key: 'mm_user_id'], fetch: 'join'
}

Bankクラスでは、layy:falseの代わりにfetch:'join'をマッピングに使用します

于 2012-10-10T22:36:54.723 に答える
0

どうもありがとう、セルゲイ、うまくいきませんでした。

私はそれを醜い方法で修正しましたが、これが私の残りの方法でした。

MM テーブルをマッピングするために別のドメイン クラスを作成したので、クラスを作成しましたmm_user_banks。銀行またはユーザーからレコードを取得するために使用し、問題なく動作しました。ユーザーのために銀行を保存するために、私は実際には古い方法でもそれを行っており、それから変更していません。これは最善の方法ではないかもしれませんが、私が言ったようにうまくいきました.

「fetch: 'join'」と「lazy: false」と「static fetchMode = [banks: 'eager']」を試しましたが、成功しませんでした。

新しいドメイン クラスは次のとおりです。

class UserBanks {

    User user
    Bank bank

    static constraints = {
    }

    static mapping = {
        table name: 'mm_user_banks'
        user column: 'mm_user_id'
        bank column: 'mm_bank_id'
    }
}
于 2012-10-11T13:15:41.237 に答える
0

同様の問題がありましたが、私の場合、ユーザーと銀行に相当するものの間に別の関係がありました。これにより、hasMany ステートメントが間違ったリレーションを使用して多対多リレーションをマップするようになりました。私の場合、リレーションにmappedByステートメントを追加することで解決しました:

class Bank{
    ...
    static mappedBy=[users:'banks']
    ...
}

class User{
    ...
    static mappedBy=[banks:'users']
    ...
}

または、私の場合のように、それは一方向の関係だったので:

class ArticleGroup {

    String name
    static hasMany = [articles:Article]

    static mappedBy = [articles: 'none']

    static constraints = {
        name(nullable:false, blank:false, unique:true, maxSize:100)
    }

    static mapping = {
        table 'article_group'
        sort 'name'

        articles joinTable: [name:'article_group_article', key: 'articleGroup_id', column:'article_id'], fetch: 'join'

    }
于 2014-11-12T15:07:30.837 に答える