Grails/GORM类和子类与复合键映射
我需要映射遗留数据库的域类和子类 我需要用Grails重新创建的模型如下表所示: CARD_PAYMET和Check_PAYMENT是支付的子类,共享两个字段的组合键:OrderId和PaymentId 我尝试了一些前场景,但我无法找到解决方案。没有人会重新创建相同的模型数据,我无法更改此模型 有人能帮我吗Grails/GORM类和子类与复合键映射,grails,gorm,grails-2.0,grails-domain-class,Grails,Gorm,Grails 2.0,Grails Domain Class,我需要映射遗留数据库的域类和子类 我需要用Grails重新创建的模型如下表所示: CARD_PAYMET和Check_PAYMENT是支付的子类,共享两个字段的组合键:OrderId和PaymentId 我尝试了一些前场景,但我无法找到解决方案。没有人会重新创建相同的模型数据,我无法更改此模型 有人能帮我吗 谢谢。您的数据库看起来非常适合。首先,由于您使用的是复合主键,因此域类需要实现可序列化的接口。然后是将每个表列映射到属性的问题 import groovy.transform.Equals
谢谢。您的数据库看起来非常适合。首先,由于您使用的是复合主键,因此域类需要实现可序列化的接口。然后是将每个表列映射到属性的问题
import groovy.transform.EqualsAndHashCode
@EqualsAndHashCode(includes=['orderId', 'paymentId'])
class Payment implements Serializable {
int orderId
int paymentId
float amount
static mapping = {
version false
tablePerHierarchy false
id composite: ['orderId', 'paymentId']
orderId column: 'OrderId'
paymentId column: 'PaymentId'
/* Assuming case-insensitive db, so I left out 'Amount'. */
}
}
class CardPayment extends Payment {
String cardType
static mapping = {
version false
cardType column: 'CardType'
}
}
class ChequePayment extends Payment {
int checkNumber
static mapping = {
version false
checkNumber column: 'CheckNumber'
}
}
注意:在这个示例中,我使用Groovy的EqualsAndHashCode
AST转换来实现Serializable
有了域类,您将能够执行GORM多态查询:
def payments = Payment.list() // All Payments (Payment, CardPayment, and ChequePayment).
def cardPayments = CardPayment.list() // Only CardPayments.
...
def nicePayments = Payment.where { amount > 1000 }.list()
继承是如何在遗留数据库中建模的?您的问题在某种程度上还不清楚。请重新阅读您的问题,并添加域类代码。Emmanuel:我已经尝试过这个场景,但在尝试启动应用程序时出现了一个异常:当Grails尝试部署Payments的任何子类时,子类键映射的列数错误。另外,以下是堆栈跟踪错误:由MappingException引起:子类键映射的列数错误:pagos.CardPayment类型:component[orderId,paymentId]我做了一些实验,得出结论,每个子类的表继承不支持复合主键:(可以为表创建域类,但只能在没有继承的情况下创建。我使用Groovy trait创建了一个演示。它可以工作…好的。显然,您不会得到多态查询,您必须手动管理引用完整性。请在此处查看:。