多对多只检索一行

时间:2012-10-10 18:50:10

标签: grails gorm

我有两个域类之间的关系:用户银行,用户有很多银行和银行有很多用户,结果表我称之为{ {1}}保留MM关系的两个表ID。

mm_user_banks

和银行......

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 } } 中此用户有多行,它也只会获取一行表

E.g:

mm_user_banks

在数据库中,可以获取3行,但是当我找到用户并查看其银行列表时:

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 个答案:

答案 0 :(得分:0)

刚试过 - “user.banks?.size()”返回“3”。您确定数据库中的数据是否正常?

无论如何,如果你想对集合使用eager fetching,那么在User class的“mapping”中定义它(而不是“fetchMode”静态字段):

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

在映射中使用 fetch:'join'而不是lazy:false

答案 1 :(得分: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'
    }
}

答案 2 :(得分: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'

    }