不需要的 GORM table 创建

Unwanted GORM table creation

我有两个域 类,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 table,并向 WORKSHOP table 添加了一个 OWNER_ID 列.这一切都很好。

但是,它还创建了一个 WORKSHOP_OWNER table 和 PERSON_ID 和 OWNER_ID 列!这对我来说毫无意义,无论我如何尝试改变 GORM 关系,如果不创建这个烦人的额外 table,我就无法让它按照我想要的方式工作。如何防止创建 WORKSHOP_OWNER table?任何帮助是极大的赞赏! (如果有帮助,我使用的是 Grails 2.3.7)

为了摆脱 WORKSHOP_OWNER table,您必须在创意工坊 class 中将 Person owner 替换为 static belongsTo = [owner: Person]。但这会与 Person class 中的 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拥有。车间 table 将得到一个 owner_id 来指代此人,这去掉了 workshop_owner table.

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

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

您会在 Person 中丢失 enrolledWorkshops 属性,但您可以通过查询完成同样的事情。

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