Wäre dies der richtige Weg, um die Eltern- und Kindklassen von Grails zu erweitern?Erweitern der Domänenklasse mit einer 1: n-Beziehung in Grails
Ursprünglich dachte ich, dass das Überschreiben von hasMany und aneigniesTo-Eigenschaften eine gute Idee wäre, aber das funktionierte nicht so gut, da es widersprüchliche Funktionen einführte, sodass ich es aus den Unterklassen entfernte.
Was ich versuche hier zu tun ist gepackten Code zwischen mehreren Anwendungen zu packen. Ich beginne mit diesen beiden Klassen in meinem Plugin.
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
}
}
Die anwendungsspezifische Klassen haben sowohl Kauf zu verlängern und PurchaseItem so bin ich es, wie so Umsetzung vererben eine Eins-zu-viele-Beziehung:
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
}
}
}
Die namedQuery in TicketPurchaseItem verbinden Kauf und Flug selbst obwohl Super-Klasse Purchase nicht zuFloat gehört, tut dies nur die Unterklasse 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)
Dies funktioniert mit Grails, aber es ist ein gutes Design oder gibt es eine bessere Art und Weise mit Domain-Klassen zu beschäftigen eine Eins-zu-viele-Beziehungen erstreckt?