0

我在两个域类之间有一个关系:UserBank,用户有很多银行,银行有很多用户,我称之为结果表,因为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表中该用户的行数不止一行,它也只获取一行。

例如:

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

我有类似的问题,但在我的情况下,我与用户和银行的等价物之间存在另一种关系。这使得 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 回答
0

刚刚对其进行了测试-“user.banks?.size()”返回“3”。您确定数据库中的数据正常吗?

无论如何,如果你想对集合使用渴望获取,那么在 User 类的“映射”中定义它(而不是“fetchMode”静态字段):

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

在 Bank 类中使用fetch: 'join' in mapping 而不是lazy: false

于 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 回答