简体   繁体   中英

Grails/GORM Class and subclass with composite key mapping

I need to map Domain classes and subclasses of a legacy database.

The model thath I need to recreate with Grails is to this tables:

Tables structure

CARD_PAYMET and CHEQUE_PAYMENT is subclasses of PAYMENT and share a composite key of two field: OrderId and PaymentId.

I try some ex scenarios, but I can´t arrive to solution. None of then recreate the same model data, and I can´t change this model.

Can any one help me?

Thanks.

Your database looks like a good fit for table-per-subclass inheritance . First, since you're using a composite primary key, your domain classes need to implement the Serializable interface. Then it's a matter of mapping each table column to a property.

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'
    }
}

Note: In this example I used Groovy's EqualsAndHashCode AST transformation to implement Serializable .

With the domain classes in place you'll be able to do GORM polymorphic queries:

def payments = Payment.list() // All Payments (Payment, CardPayment, and ChequePayment).
def cardPayments = CardPayment.list() // Only CardPayments.
...
def nicePayments = Payment.where { amount > 1000 }.list()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM