我有两个域类之间的关系:用户和银行,用户有很多银行和银行有很多用户,结果表我称之为{ {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)
提前致谢!
答案 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'
}