在 Grails 中扩展具有一对多关系的域类

Posted

技术标签:

【中文标题】在 Grails 中扩展具有一对多关系的域类【英文标题】:Extending domain class with one-to-many relationship in Grails 【发布时间】:2015-08-24 22:04:51 【问题描述】:

这是扩展 Grails 父类和子类的正确方法吗?

最初我认为覆盖 hasMany 和 belongsTo 属性是个好主意,但效果不佳,因为它引入了冲突的功能,所以我从子类中删除了它。

我在这里尝试做的是在多个应用程序之间打包共享代码。我从插件中的这两个类开始。

class Purchase 
    String firstName
    String lastName

    static mapping = 
         tablePerHierarchy false
    

    static hasMany = [items: PurchaseItem]


class PurchaseItem 
    BigDecimal price
    Integer qty

    statiuc belongsTo = [purchase: Purchase]

    static mapping = 
         tablePerHierarchy false
    


应用程序特定的类必须同时扩展 Purchase 和 PurchaseItem 所以我像这样实现它,继承一对多的关系:

class Flight 

    static hasMany = [purchases: TicketPurchase]


class TicketPurchase extends Purchase 
    // some class specific properties

    static belongsTo = [flight: Flight]



class TicketPurchaseItem extends PurchaseItem 

    Integer bagQty

    static namedQueries = 
        ticketPurchaseItemsWithBagsByFlight flightInstance->
            purchase 
                flight 
                    eq 'id', flightInstance.id
                
            
            gt 'bagQty', 0
        
    

TicketPurchaseItem 中的namedQuery 加入了Purchase 和Flight,即使超类Purchase 不属于Flight,只有子类TicketPurchase 属于。

TicketPurchase ticketPurchase = new TicketPurchase()
ticketPurchase.addToItems(new TicketPurchaseItem(bagQty: 5)).save()

Flight flight = Flight.first()
flight.addToPurchases(ticketPurchase).save()

// this works
def ticketPurchaseItemList = TicketPurchaseItem.ticketPurchaseItemsWithBagsByFlight(flight)

这适用于 Grails,但它是好的设计还是有更好的方法来处理扩展一对多关系的域类?

【问题讨论】:

【参考方案1】:

简短的回答是你做对了。大概。要问的问题是您是否可以允许将已添加到子类的属性设置为 NULL。我不认为你有什么问题。您可以从 Grails documentation 和我的博客 article 中了解有关 Grails 域类继承和多态查询的更多信息。

如果您对域类模型对数据库的影响感到好奇,您可以通过日志记录查看 GORM/Hibernate 正在运行的查询。我相信this 是我用来设置日志记录的文章。

【讨论】:

以上是关于在 Grails 中扩展具有一对多关系的域类的主要内容,如果未能解决你的问题,请参考以下文章

Grails里DOMAIN类的一对一,一对多,多对多关系总结及集成测试

为啥当我在 grails 上删除一对多关系上的父级时,会在子级上调用 beforeInsert 事件?

grails一对一关联关系

Grails 3 中一对多域的深拷贝

grails 一对多求和

在卡桑德拉处理一对多