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