【问题标题】:Grails/GORM Class and subclass with composite key mapping具有复合键映射的 Grails/GORM 类和子类
【发布时间】:2016-01-01 21:37:28
【问题描述】:

我需要映射旧数据库的域类和子类。

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

Tables structure

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

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

谁能帮帮我?

谢谢。

【问题讨论】:

  • 遗留数据库中的继承是如何建模的?
  • 您的问题在某些时候不清楚。请重新阅读您的问题并添加域类代码。

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


【解决方案1】:

您的数据库看起来很适合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()

【讨论】:

  • Emmanuel:我已经尝试过这种情况,但当我尝试启动应用程序时出现异常:当 Grails 尝试部署 Payment 的任何子类时,子类键映射的列数错误
  • 此外,这里是堆栈跟踪错误:由 MappingException 引起:子类键映射的列数错误:pagos.CardPayment 类型:组件 [orderId,paymentId]
  • 我做了一些实验,得出的结论是 table-per-subclass 继承不支持复合主键 :( 可以为表创建域类,但不能继承。我使用 Groovy 特征创建了一个演示。它可以工作...... 好的。显然你没有得到多态查询,你必须手动管理引用完整性。在这里查看:bitbucket.org/erosa/inheritance-example/overview
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多