Trong grails, tôi có thể thực hiện một N: 1 mối quan hệ như thế này:Khi nào có nên sử dụng cho các mối quan hệ N: 1 trong các lớp miền grails?
class Parent { hasMany = [children:Child] }
class Child { belongsTo = [parent:Parent] }
Bây giờ (nếu addTo và removeFrom luôn là sử dụng đúng cách) tôi có thể nhận trẻ em của cha mẹ qua parent.children.
Nhưng tôi cũng có thể làm điều đó mà không hasMany:
class Parent { }
class Child { belongsTo = [parent:Parent] }
Sau đó, tôi phải sử dụng Child.findAllByParent (mẹ) để có được tất cả trẻ em.
Câu hỏi của tôi: Có bất kỳ lý do quan trọng nào tại sao tôi nên sử dụng hasMany nếu có thể truy vấn con của cha mẹ theo cách thứ hai không?
Tôi đoán rằng đôi khi nó dễ dàng hơn (và có lẽ nhanh hơn nếu háo hức tìm nạp cùng với phụ huynh?) Để chỉ tham khảo parent.children, nhưng mặt khác Danh sách này có thể trở nên khá dài khi có nhiều trẻ em. Và những gì tôi không thích về hasMany hoặc là bạn luôn luôn phải chăm sóc về addTo hoặc removeFrom hoặc để xóa phiên sau khi thêm một đứa trẻ mới với một phụ huynh để grails hiện điều này tự động ...
Is câu trả lời rằng bạn chỉ nên sử dụng hasMany nếu có rất ít trẻ em và không sử dụng nó nếu có nhiều (vì lý do hiệu suất), hoặc là có nhiều hơn đằng sau nó?
Cảm ơn bạn, vì vậy, đó là tất cả về hành vi xếp tầng. Bạn có nói rằng hiệu suất không phải là một vấn đề khi danh sách quản lý cho trẻ em trở nên rất lớn? Về cập nhật của bạn, tiếc là tiết kiệm với tuôn ra: đúng là không đủ cho tự động addTo/removeFrom. Như tôi đã học trong vấn đề grails được gửi của tôi https://cvs.codehaus.org/browse/GRAILS-6356, bạn cần xóa phiên với sessionFactory.currentSession.clear() nếu bạn muốn đạt được điều này WITHIN một kiểm tra hoặc một bộ điều khiển . Trong quá trình sản xuất giàn giáo, nó hoạt động vì phiên được xóa sau hành động lưu/cập nhật của Trẻ. –
Chỉ cần thử nghiệm nó và có vẻ như việc xóa tầng là ngược lại với những gì bạn nói lúc đầu: Trong ví dụ ĐẦU TIÊN của tôi (với hasMany), khi xóa một phụ huynh, tất cả trẻ em cũng bị xóa. Trong ví dụ SECOND (không có hasMany), trẻ em phải được xóa thủ công trước khi xóa một phụ huynh. –
Trên thực tế thử nghiệm của tôi cũng tiết lộ rằng trong ví dụ của bạn với hasMany và không có thuộc tính, việc xóa của cha mẹ KHÔNG gây ra cho trẻ em có một phụ huynh rỗng nhưng ném một DataIntegrityViolationException ... Tôi phải đặt cha mẹ của trẻ em để null trước khi xóa . –