2015-06-09 17 views
5

Questo sarebbe il modo corretto di estendere le classi padre e figlio di Grails?Estensione della classe di dominio con relazione uno a molti in Grails

Inizialmente pensavo che l'override di hasMany e appartiene alle proprietà, sarebbe una buona idea ma non ha funzionato così bene in quanto ha introdotto funzionalità in conflitto così l'ho lasciato cadere da sottoclassi.

Quello che sto cercando di fare qui è di pacchettizzare codice condiviso tra più applicazioni. Sto iniziando con queste due classi nel mio plugin.

specifiche classi
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 
    } 

} 

L'iscrizione dovrà estendersi sia Acquisto e PurchaseItem così sto mettendo in atto in questa maniera, ereditare uno-a-molti:

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 
     } 
    } 
} 

Il namedQuery in TicketPurchaseItem unisce Acquisto e Flight anche sebbene l'acquisto super classe non appartenga al volo, solo la sottoclasse TicketPurchase fa.

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) 

Questo funziona con Grails, ma è un buon design o c'è un modo migliore per trattare con classi di dominio che si estendono relazioni uno-a-molti?

risposta

0

La risposta breve è che hai capito bene. Probabilmente. La domanda da porsi è se stai accettando che le proprietà che hai aggiunto alle sottoclassi siano impostate su NULL. Non vedo un problema con quello che hai. È possibile ottenere ulteriori informazioni sull'ereditarietà della classe di dominio Grails e sulle query polimorfiche da Grails documentation e dal mio blog article sull'argomento.

Se sei curioso dell'impatto del tuo modello di classe di dominio sul database, puoi dare un'occhiata alle query che GORM/Hibernate sta eseguendo effettuando la registrazione. Credo che this sia l'articolo che ho usato per configurare la registrazione.

Problemi correlati