我有两个域类,Person和Workshop。 Workshop有一个Person类型的所有者,以及Person类型的许多参与者。一个人可以成为许多研讨会的参与者。当我在工作室注册人员时,我想从Workshop.AddToParticipants()这样做,所以这里是我如何设置我的域类。
class Person {
String name
static hasMany = [enrolledWorkshops: Workshop]
static belongsTo = [Workshop]
}
class Workshop {
Date startDate
Date endDate
String name
Person owner
static hasMany = [participants: Person]
}
GORM正确创建一个包含WORKSHOP_ID和PERSON_ID列的WORKSHOP_PARTICIPANTS表,并将一个OWNER_ID列添加到WORKSHOP表中。这一切都很好。
但是,它还创建了一个包含PERSON_ID和OWNER_ID列的WORKSHOP_OWNER表!这对我来说没有任何意义,无论我如何尝试更改GORM关系,我都无法让它按照我想要的方式工作,而不会创建这个烦人的额外表。如何防止创建WORKSHOP_OWNER表?任何帮助是极大的赞赏! (如果有任何帮助,我使用的是Grails 2.3.7)
答案 0 :(得分:1)
为了摆脱WORKSHOP_OWNER表,你必须在Workshop类中用Person owner
替换static belongsTo = [owner: Person]
。但这会与Person类中的static belongsTo = [Workshop]
冲突。两者都不能成为所有者。
试试这个:
class Person {
String name
}
class Workshop {
Date startDate
Date endDate
String name
static belongsTo = [owner: Person]
static hasMany = [participants: Participant]
}
class Participant {
person person
static belongsTo = [workshop: Workshop]
}
在上面的示例中,Person
拥有Workshop
,而Participant
归Workshop
所有。研讨会表将获得owner_id以引用该人员,该人员摆脱了workshop_owner表。
要将Person
添加到Workshop
,您只需将其包装在Participant
workshop.addToParticipants(new Participant(person: somePerson))
您在Person
中放弃了已注册的工作坊属性,但您可以通过查询完成相同的操作。
def workshops = Workshop.withCriteria {
participants {
eq 'person', somePerson
}
}