这是扩展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
}
}
Run Code Online (Sandbox Code Playgroud)
特定于应用程序的类必须扩展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
}
}
}
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
这适用于Grails,但它是好的设计还是有更好的方法来处理扩展一对多关系的域类?
简短的回答是你做对了。大概。要问的问题是您是否同意允许将添加到子类的属性设置为 NULL。我不认为你所拥有的有什么问题。您可以从 Grails文档以及我关于该主题的博客文章中了解有关 Grails 域类继承和多态查询的更多信息。
如果您对域类模型对数据库的影响感到好奇,您可以通过记录来查看 GORM/Hibernate 正在运行的查询。我相信这是我用来设置日志记录的文章。
| 归档时间: |
|
| 查看次数: |
810 次 |
| 最近记录: |