2015-06-09 12 views
5

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?

Antwort

0

Die kurze Antwort ist, Sie haben es richtig gemacht. Wahrscheinlich. Die Frage, die Sie stellen sollten, ist, ob Sie damit einverstanden sind, dass die Eigenschaften, die Sie zu Ihren Unterklassen hinzugefügt haben, auf NULL gesetzt werden dürfen. Ich sehe kein Problem mit dem, was Sie haben. Sie können mehr über Grails Domain Class Vererbung und polymorphe Abfragen von den Grails documentation und von meinem Blog article zu dem Thema lernen.

Wenn Sie neugierig auf die Auswirkungen Ihres Domänenklassenmodells auf die Datenbank sind, können Sie sich die Abfragen anzeigen lassen, die GORM/Hibernate ausführt, indem Sie sie dann protokollieren. Ich glaube, this ist der Artikel, den ich verwendet habe, um Protokollierung einzurichten.

Verwandte Themen