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

时间:2009-03-12 17:54:50

标签: grails gorm

假设我有两个表员工薪水且关系为1:N(一个薪水可以与很多员工关联)。

在纯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 个答案:

答案 0 :(得分:2)

IMO无法使用普通的Grails / GORM连接多个表并将它们映射到一个Domain类。作为一种解决方法,您可以使用遗留的XML hibernate映射并利用join feature来实现您期望的目标。当然,你会失去许多GORM好东西。

答案 1 :(得分: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

答案 2 :(得分:0)

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

授予,这不是grails方式,强烈建议您遵循grails方式。

答案 3 :(得分:-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

也有可能你可以使用自定义的hibernate映射文件来制作你要求的工作,但是我不太熟悉以这种方式扭曲hibernate来肯定地说。

请参阅Custom User Type section of this page