Grails/GORM中的遗留映射:1:N关系中的一个域类和两个表

Grails/GORM中的遗留映射:1:N关系中的一个域类和两个表,grails,gorm,Grails,Gorm,假设我有两个表employee和salary,它们的关系为1:N(一个salary可以与多个员工关联) 在纯SQL中,表将与以下对象连接: SELECT e.id, e.name, s.salary FROM employee e, salary s WHERE s.id = e.salary_id AND e.id = 12345; 假设以下GORM支持的域类,如何将遗留数据库结构映射到该类 class Employee { String name int salary } 澄

假设我有两个表employee和salary,它们的关系为1:N(一个salary可以与多个员工关联)

在纯SQL中,表将与以下对象连接:

SELECT e.id, e.name, s.salary FROM employee e, salary s WHERE s.id = e.salary_id AND e.id = 12345;
假设以下GORM支持的域类,如何将遗留数据库结构映射到该类

class Employee {
   String name
   int salary
}
澄清#1:我只希望一个域类包含两个表中的数据。因此,添加另一个类不是一个选项


澄清#2:我试图找到答案的问题只是“如何使用Grails/GORM将两个表映射到一个类”?如果您认为这是不可能的,那么请在您的回答中清楚地说明这一点,而不是试图重述这个问题。

您的SQL示例表明有两个表,Employee和Salary。这也应该反映在你的课堂上。因此,您需要两个类,而不是一个。GORM映射将如下所示

class Employee {
   String name
   Salary salary
}

class Salary {
   static hasMany = [ employees : Employee ]
   int salary
}

请参见

您的SQL示例表明有两个表,Employee和Salary。这也应该反映在你的课堂上。因此,您需要两个类,而不是一个。GORM映射将如下所示

class Employee {
   String name
   Salary salary
}

class Salary {
   static hasMany = [ employees : Employee ]
   int salary
}

请参见

如果数据库中有两个表,我不完全理解不能添加另一个类的限制,但是如果您希望有一个统一的接口,将方法委托给Salary类是否可行

比如:

class Salary {
    int amount
}

class Employee {
    Salary _salary
    String name

    String toString() { name }

    public Integer getSalary() {
        return _salary?.amount
    }
    public void setSalary(Integer amount) {
    // not quite sure of your business logic here, this is a guess
        _salary = Salary.findByAmount(amount)
        if (!_salary) {
            _salary = new Salary(amount: amount)
            _salary.save()
        }
    }
}


def e = new Employee(name:"willy loman", salary: 100)
e.save()
assert e.salary == 100
也有可能您可以使用自定义的hibernate映射文件来实现所需的功能,但我对以这种方式扭曲hibernate还不太熟悉,所以不能肯定


请参阅。

如果数据库中有两个表,我不完全理解不能添加另一个类的限制,但是如果您希望有一个统一的接口,将方法委托给Salary类是否可行

比如:

class Salary {
    int amount
}

class Employee {
    Salary _salary
    String name

    String toString() { name }

    public Integer getSalary() {
        return _salary?.amount
    }
    public void setSalary(Integer amount) {
    // not quite sure of your business logic here, this is a guess
        _salary = Salary.findByAmount(amount)
        if (!_salary) {
            _salary = new Salary(amount: amount)
            _salary.save()
        }
    }
}


def e = new Employee(name:"willy loman", salary: 100)
e.save()
assert e.salary == 100
也有可能您可以使用自定义的hibernate映射文件来实现所需的功能,但我对以这种方式扭曲hibernate还不太熟悉,所以不能肯定


请参阅。

您可以将salary和name作为属性,而将它们作为get*方法,在这两个表上实际运行查询


诚然,这不是grails的方式,强烈建议您遵循grails的方式

您可以将salary和name作为属性,而将它们作为get*方法,实际在这两个表上运行查询


诚然,这不是grails的方式,强烈建议您遵循grails的方式

IMO使用普通的Grails/GORM不可能连接多个表并将它们映射到一个域类。作为一种解决方法,您可以使用遗留的XML hibernate映射,并利用来实现所需的目标。当然,您会失去很多GORM的好处。

对于普通的Grails/GORM来说,连接多个表并将它们映射到一个域类是不可能的。作为一种解决方法,您可以使用遗留的XML hibernate映射,并利用来实现所需的目标。当然你们会失去很多GORM的好东西。

谢谢你们的回答,但增加另一个类是不可能的。请看我的澄清。谢谢你的回答,但添加另一个类是不可能的。请看我的说明。这是一个非常奇怪的要求,不能有第二类-通常是相反的方式,你不能有两张桌子。这个需求可能是一个更大问题的症状,解决这个问题将一次性解决所有的小问题。最好能提供一个理由。不能上第二堂课是一个非常奇怪的要求——通常情况下,你不能有两张桌子。这个需求可能是一个更大问题的症状,解决这个问题将一次性解决所有的小问题。最好能提供一个理由。