如何在gorm中的两个实体之间创建一对多,多对一的关联?

时间:2014-09-09 10:50:57

标签: postgresql grails one-to-many

我是Grails的新手。我有两个表之间多对一和一对多的生成关联的问题。我正在使用postgresql数据库。

Employee.groovy

class Employee {

    String firstName
    String lastName
    int hoursLimit
    Contact contact
    Account account
    Unit unit
    char isBoss

    static hasMany = [positionTypes:PositionType, employeePlans: EmployeePlan]
}

EmployeePlan.groovy

class EmployeePlan {

    AcademicYear academicYear
    HourType hourType
    int hours
    float weightOfSubject
    Employee employee

    static belongsTo = [SubjectPlan]
}

我想从员工访问employeePlans列表以及从EmployeePlan到Employee实例的访问权限。不幸的是,GORM只生成两个表Employee和EmployeePlan with employee_id。我没有第三个表,它应该有两列employee_id和employee_plan_id。你可以帮帮我吗 ?

2 个答案:

答案 0 :(得分:0)

我认为您的设置是正确的,因为您从Employee类编写时可以访问EmployeePlan的集合(请注意,如果您没有像List一样明确定义EmployeePlan,默认情况下它将是一个Set)并且从EmployeePlan您可以访问Employee。 如果您需要List,可以这样定义:

class Employee {

String firstName
String lastName
int hoursLimit
Contact contact
Account account
Unit unit
char isBoss
//explicitly define List
List<EmployeePlan> employeePlans

static hasMany = [positionTypes:PositionType, employeePlans: EmployeePlan]
}

但回到你的问题。您想在Employee和employeePlan之间建立联接表,但为什么呢?它没有必要,因为你有集合(无序)的双向映射,grails不会创建连接表。你能解释一下为什么需要吗?在grails中,引用将自动填充,所以我在这里看不到任何问题。 如果需要保留employeePlans的顺序,则将其定义为List,如上所示,grails将创建一个带有相应索引的连接表。

答案 1 :(得分:0)

你读过ref-doc吗?它立即给你答案:

class Person {
  String firstName

  static hasMany = [addresses: Address]

  static mapping = {
    table 'people'
    firstName column: 'First_Name'
    addresses joinTable: [name: 'Person_Addresses',
                          key: 'Person_Id',
                          column: 'Address_Id']
  }
}