假设我有两个表员工和薪水且关系为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将两个表映射到一个类”?如果你认为不可能这样做,那么请在答案中清楚说明,而不是试图重述这个问题。
答案 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
}
答案 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来肯定地说。