在Grails中用一对多关系扩展域类

在Grails中用一对多关系扩展域类,grails,gorm,Grails,Gorm,这是扩展Grails父类和子类的正确方法吗 最初我认为重写hasMany和belongsTo属性是一个好主意,但由于它引入了相互冲突的功能,所以我将其从子类中删除 我在这里尝试的是打包多个应用程序之间的共享代码。我从插件中的这两个类开始 class Purchase { String firstName String lastName static mapping = { tablePerHierarchy false } stati

这是扩展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
    }

}
特定于应用程序的类必须同时扩展PurchaseItem和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才属于Flight

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,但这是一种好的设计,还是有更好的方法来处理扩展一对多关系的域类?

简单的回答是,您做对了。可能要问的问题是,您是否同意将添加到子类中的属性设置为NULL。我看你的东西没有问题。您可以从Grails和我的博客中了解更多关于Grails域类继承和多态查询的信息

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