1

假设我有两张表employeesalary具有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 将两个表映射到一个类”?如果您认为不可能这样做,那么请在您的回答中清楚地说明这一点,而不是试图重述问题。

4

4 回答 4

2

IMO 不可能使用普通的 Grails/GORM 来连接多个表并将它们映射到一个域类。作为一种解决方法,您可以使用传统的 XML 休眠映射并利用连接功能来实现您想要的目标。当然,你会失去很多 GORM 的好东西。

于 2009-03-16T10:31:29.400 回答
0

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

class Employee {
   String name
   Salary salary
}

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

http://www.grails.org/GORM+-+Defining+relationships

于 2009-03-12T18:51:37.693 回答
0

您可以不将薪水和姓名作为属性,而是将它们作为实际在这两个表上运行查询的 get* 方法。

当然,这不是 grails 方式,强烈建议您遵循 grails 方式。

于 2009-03-14T04:23:12.210 回答
-1

如果数据库中有 2 个表,我不完全理解不能添加另一个类的限制,但是如果您希望有一个统一的接口,将方法委托给 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

也有可能您可以使用自定义休眠映射文件来实现您所要求的工作,但我对以这种方式扭曲休眠还不够熟悉,无法肯定地说。

请参阅本页的自定义用户类型部分

于 2009-03-14T03:37:20.917 回答