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

时间:2015-06-09 21:20:32

标签: grails gorm

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

最初我认为重写hasM​​any和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 个答案:

答案 0 :(得分:0)

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

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