2015-06-09 13 views
5

Đây có phải là cách chính xác để mở rộng các lớp cha và con của Grails không?Mở rộng lớp miền với mối quan hệ một-nhiều trong Grails

Ban đầu tôi nghĩ rằng ghi đè thuộc tính hasMany và thuộc tính, sẽ là một ý tưởng hay nhưng điều đó không hoạt động tốt như nó đã giới thiệu chức năng xung đột vì vậy tôi đã loại bỏ nó khỏi các lớp con.

Điều tôi đang cố gắng làm ở đây là đóng gói mã được chia sẻ giữa nhiều ứng dụng. Tôi bắt đầu với hai lớp này trong plugin của tôi.

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 
    } 

} 

Ứng dụng các lớp cụ thể cần phải mở rộng cả Mua PurchaseItem vì vậy tôi đang thực hiện nó như vậy, kế thừa một-nhiều mối quan hệ:

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

Các namedQuery trong TicketPurchaseItem tham gia Mua Flight thậm chí Mặc dù Super Class Purchase không thuộc về Flight, chỉ có lớp con TicketPurchase thực hiện.

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) 

Điều này làm việc với Grails nhưng có thiết kế tốt hay cách tốt hơn để xử lý các lớp miền mở rộng mối quan hệ một-nhiều?

Trả lời

0

Câu trả lời ngắn gọn là bạn đã hiểu đúng. Có lẽ. Câu hỏi đặt ra là liệu bạn có đồng ý với việc cho phép các thuộc tính bạn đã thêm vào các lớp con của mình được đặt thành NULL không. Tôi không thấy vấn đề gì với những gì bạn có. Bạn có thể tìm hiểu thêm về các truy vấn thừa kế và truy vấn đa hình lớp Grails từ Grails documentation và từ blog của tôi article về chủ đề này.

Nếu bạn tò mò về tác động của mô hình lớp miền của bạn trên cơ sở dữ liệu, bạn có thể xem xét các truy vấn GORM/Hibernate đang chạy bằng cách ghi nhật ký. Tôi tin rằng this là bài viết tôi đã sử dụng để thiết lập ghi nhật ký.

Các vấn đề liên quan