Grails/GORM中的遗留映射:1:N关系中的一个域类和两个表
假设我有两个表employee和salary,它们的关系为1:N(一个salary可以与多个员工关联) 在纯SQL中,表将与以下对象连接: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 } 澄
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的好东西。谢谢你们的回答,但增加另一个类是不可能的。请看我的澄清。谢谢你的回答,但添加另一个类是不可能的。请看我的说明。这是一个非常奇怪的要求,不能有第二类-通常是相反的方式,你不能有两张桌子。这个需求可能是一个更大问题的症状,解决这个问题将一次性解决所有的小问题。最好能提供一个理由。不能上第二堂课是一个非常奇怪的要求——通常情况下,你不能有两张桌子。这个需求可能是一个更大问题的症状,解决这个问题将一次性解决所有的小问题。最好能提供一个理由。