2009-09-03 15 views
7

Cái này dành cho người dùng Grails tại đây. Tôi hỏi nó trên grails - danh sách gửi thư của người dùng, nhưng tôi đã tìm ra từ khi tôi đã chiến đấu trong một vài ngày, tôi nên bỏ càng nhiều càng tốt.Grails - nhiều thuộc tính của cùng một lớp với xóa tầng

Tôi gặp khó khăn khi cố gắng mô hình mối quan hệ giữa hai đối tượng cùng loại trong một đối tượng khác (loại khác) tham chiếu hai đối tượng.

Ví dụ về những gì tôi đang cố gắng làm, giả sử bạn đang lập mô hình mối quan hệ giữa các thành viên trong gia đình. Bất kỳ mối quan hệ nào được cho là "thuộc về" hai thành viên gia đình khác nhau. Vì vậy:

class Person { 
    hasMany[relationships: Relationship] 

    static mappedBy = [relationships:'p1', relationships:'p2'] 
} 

class Relationship { 

    Person p1 
    Person p2 
    String natureOfRelationship // for example, "cousins" 

    static belongsTo = [p1: Person, p2: Person] 
} 

Mục đích ở đây là nếu một trong hai p1 hay p2 bị xóa, thì xóa chí thác cho tất cả các đối tượng quan hệ trong bản đồ hasMany. Thay vào đó, mỗi lần Tôi thử nó, tôi kết thúc với một vi phạm chính nước ngoài. Tôi đã cố gắng sử dụng "cascade" thuộc tính như nêu trong tài liệu:

http://grails.org/doc/1.0.x/guide/single.html#5.5.2.9%20Custom%20Cascade%20Behaviour

Vì vậy, tôi figured tôi sẽ thêm này đến lớp Person:

static mapping = { 
    relationships cascade:'delete' 
} 

tôi không có bất kỳ may mắn với điều đó.

Tôi cũng đã xem tệp devDB.script mà Grails tạo ra, để xem cách nó thiết lập khóa ngoài trên Mối quan hệ. Nếu tôi thêm "ON DELETE CASCADE" vào cả hai ràng buộc khóa ngoại, thì nó hoạt động tốt, nhưng rõ ràng thực hiện chỉnh sửa thủ công đối với tập lệnh cơ sở dữ liệu được tạo tự động không phải là giải pháp mạnh mẽ nhất. Lý tưởng nhất là tôi muốn có thể chỉ định hành vi đó bằng cách sử dụng GORM.

Vậy cược nào tốt nhất của tôi ở đây? Có cách nào để buộc xóa tầng trên nhiều khóa/chủ sở hữu nước ngoài không? Tôi có cần phải thực hiện thao tác này theo cách thủ công với một hành động xóa trên Cá nhân không? Tôi có cần phải nhận được vào cấu hình Hibernate cho điều này, hoặc tôi có thể làm điều đó trong Grails/GORM một cách nào đó?

Cảm ơn bạn rất nhiều vì đã dành thời gian và hỗ trợ bạn có thể cung cấp.

+0

dave, bạn đã giải quyết vấn đề này như thế nào? tôi nghĩ ngay cả mã của: static mappedBy = [mối quan hệ: 'p1', các mối quan hệ: 'p2'] là vấn đề –

Trả lời

1

Bạn có thể thêm móc beforeDelete vào lớp Người và truy vấn cha/mẹ kia. Nếu người cha/mẹ kia không tồn tại, bạn có thể xóa mối quan hệ. Lưu ý rằng bạn đang nhấn vi phạm chính ở nước ngoài vì bạn có thể cần phải xóa cả hai cha mẹ, vì mối quan hệ có một FK cho cả hai.

0

Bạn cũng có thể xác định 2 Relationshipcollections trong Person

incomingRelations và outgoingRelations dường như những lời có thể sử dụng để phân biệt (nếu áp dụng đối với tên miền của bạn).

Bạn có thể xác định một mối quan hệ sở hữu thoáng qua với chỉ một getter, mà trả về sự kết hợp của cả hai relationshipcollections (một bất biến phải chắc chắn để không sửa đổi nó/những thay đổi đó sẽ rất có thể làm cho không có ý nghĩa)

class Person { 
    Relationship incomingRelations 
    Relationship outgoingRelations 
    static mappedBy = [incomingRelations:'p1', outgoingRelations:'p2'] 

    static transients = ['relations'] 

    Set getRelations() { 
     //creates a new collection as union of the old ones 
     return Collections.unmodifiableSet(this.incomingRelations + this.outgoingRelations) 
    } 
} 
class Relationship { 
    static belongsTo = [p1:Person, p2:Person] 
} 

nếu không phù hợp với tôi sẽ thử phương pháp tiếp cận ngay cả được đề xuất bởi Miguel-Ping