不需要的GORM表创建

时间:2015-10-01 19:13:52

标签: grails gorm

我有两个域类,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)

1 个答案:

答案 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,而ParticipantWorkshop所有。研讨会表将获得owner_id以引用该人员,该人员摆脱了workshop_owner表。

要将Person添加到Workshop,您只需将其包装在Participant

workshop.addToParticipants(new Participant(person: somePerson))

您在Person中放弃了已注册的工作坊属性,但您可以通过查询完成相同的操作。

def workshops = Workshop.withCriteria {
    participants {
        eq 'person', somePerson
    }
}