当子类可能属于父类中的两个属性之一(但不是两者)时,我无法理解Grails中belongsTo - hasMany关系的概念。
例如:
class Store {
Integer storeNumber
List employees
List managers
static hasMany = [employees:Person,
managers:Person]
}
class Person {
String name
String roll
static belongsTo = [store:Store]
static constraints = {
role inList: ['employee','manager']
}
}
Person位于Store.employees列表或Store.managers列表
我在“映射中重复列...”的人身上收到错误。我尝试了一些静态映射尝试,但仍然不了解如何正确地执行它。
如何正确映射?
提前致谢....
答案 0 :(得分:1)
class Store {
Integer storeNumber
//List employees
//List managers
static hasMany = [employees:Person,
managers:Person]
static constraints = {
employees(nullable:true)
managers(nullable:true)
}
}
class Person {
String name
String roll
static belongsTo = [store:Store]
static constraints = {
role inList: ['employee','manager']
}
}
现在添加商店
Store store = new Store(storeNumber: 1).save()
if (store) {
Person person = new Person(name:'fred', roll:'employee', store:store).save()
if (person) {
store.addToEmployees(person)
}
}
因此,头痛的好处显然是反向查找父母的一种快速方式,另一种是下面描述的松散关系,它不关心父母,所以你不需要这最后一点,显然放松了依赖性问题,你打到目前为止
结束E2A
你需要一个人拥有另一种关系
或者,如果您不关心belongsTo关系,那么事情会更容易
static belongsTo = Store
那个因素不再是问题。
区别在于您使用的当前方法与我向您展示的后一种方法 - 如果从子项开始查询,您可以轻松地从子项反向步行回到父级
无论哪种方式,您始终可以从父级开始查询,然后加入子级并查找子级方面
所以你先生的套房
最终修改 你知道当你多年来一直在做这些事情时,你会找到以其他方式做事的方法:
让我们假设您确实设置了从Parent到Child的松散/弱引用,并且您想要访问Parent。方法如下:
Class User {
String username
static hasMany=[childs:Children]
}
Class Children {
String firstName
static belongsTo=User
// now to get access back to parent user without knowing parent a hackish thing like this can be done:
User getUser() {
User.findByChilds(this)
}
String getUserName() {
return user?.username
}
}
现在从一个孩子你可以做$ {instance.user}或$ {instance.userName}然后这将绑定回到父对象并通过子对象本身找到findByChilds(this)
多年前我想这会让我感到歪曲