Grails / GORM类和具有复合键映射的子类

时间:2016-01-01 21:37:29

标签: grails gorm grails-2.0 grails-domain-class

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

我需要使用Grails重新创建的模型是这个表:

Tables structure

CARD_PAYMET和CHEQUE_PAYMENT是PAYMENT的子类,并共享两个字段的组合键:OrderId和PaymentId。

我尝试了一些前场景,但我无法解决问题。然后,没有人重新创建相同的模型数据,我无法更改此模型。

任何人都可以帮助我吗?

感谢。

1 个答案:

答案 0 :(得分:0)

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

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()