Grails/GORM类和子类与复合键映射

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

我需要映射遗留数据库的域类和子类

我需要用Grails重新创建的模型如下表所示:

CARD_PAYMET和Check_PAYMENT是支付的子类,共享两个字段的组合键:OrderId和PaymentId

我尝试了一些前场景,但我无法找到解决方案。没有人会重新创建相同的模型数据,我无法更改此模型

有人能帮我吗


谢谢。

您的数据库看起来非常适合。首先,由于您使用的是复合主键,因此域类需要实现可序列化的接口。然后是将每个表列映射到属性的问题

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创建了一个演示。它可以工作…好的。显然,您不会得到多态查询,您必须手动管理引用完整性。请在此处查看:。