2012-10-15 30 views
0

我在實體 - RentalUnit和Review之間建立了一對多的關係。所有的測試運行正常,但在我加入相同的審查,以不同RentalUnit情況如下:如何確保真正的一對多關係

def review3 = Review.build().save(flush: true) 
def rentalUnit2 = RentalUnit.build(). 
    addToReviews(review2).addToReviews(review3).save(flush: true) 
assert rentalUnit.reviews.contains(review2) 

看來,格姆和addTo*方法似乎並不關心,如果我加入相同的審查情況,所以我猜測我的域類中缺少一些東西。那會是什麼?

感謝您的幫助

p.s.

class Review { 
    String submittedBy 
    String content 
    String dateReceived 
    boolean isApproved 

    static belongsTo = RentalUnit 

    static mapping = { 
     content type: 'text' 
    } 

    static constraints = { 
     submittedBy blank: false, size: 3..50 
     content blank: false, size: 5..2500 

    } 
} 

class RentalUnit { 
    String name 
    String nickname 
    Address address 
    static hasMany = [reviews:Review] 

    static mapping = { 
     reviews cascade: "all-delete-orphan" 
    } 

    static constraints = { 
     name blank: false, unique: true, size: 4..10 
     nickname blank: false, size: 5..60 
    } 
} 

回答

1

是的,它不關心 - 它不會改變任何其他對象的屬性。即使關於關係的另一端 - review2.rentalUnit(如果這樣的字段存在)在這裏將是空的。

下次從數據庫加載對象時,審閱將從rentalUnit.reviews(或review2.rentalUnit將被分配)中消失。

您可以手動指定review2.rentalUnit並驗證是否已將其添加到另一個RentalUnit,但該作業不會造成任何傷害。

編輯:讓我們一步一步完成代碼。

rentalUnit1.addToReviews(review2) 

這裏review2添加到rentalUnit1.reviewsreview2.rentalUnit未被分配,但保存在數據庫中後,它將指向rentalUnit1RentalUnit.reviews字段的唯一持久表示是子對父參考字段Review.rentalUnit

def rentalUnit2 = ... 
rentalUnit2.addToReviews(review2).addToReviews(review3).save(flush: true) 

這裏review2添加到rentalUnit2.reviewsreview2.rentalUnit不會再次分配。 review2不會從rentalUnit1.reviews中刪除,但保存後,在數據庫中,它將指向rentalUnit2

assert rentalUnit1.reviews.contains(review2) 

review2沒有從rentalUnit1.reviews去除,因此斷言會通過。但在下一個會話rentalUnit1rentalUnit2將具有正確的組review s - 只有rentalUnit2將有review2

現在,如果你想始終保持Java表示一致,implment這樣的方法:

class RentalUnit { 
    RentalUnit addToReviewsAndCheck(Review r) { 
     if (r.rentalUnit == this) return; 
     if (r.rentalUnit != null) { 
      r.rentalUnit.removeFromReviews(r) 
     } 
     r.rentalUnit = this 
     addToReviews(r) 
    } 
} 

但它是一個矯枉過正,對我來說。

+0

謝謝你Victor。請糾正我,但這意味着它實際上不是真正的一對多關係,因爲相同的審查實際上引用了兩個不同的RentalUnits(如果共享審閱更新,它會更新兩個不同的RentalUnits審閱集合)。因此,爲了實現真正的一對多關係,我們必須檢查是否在另一個租賃單位中沒有引用針對特定租賃單位添加的審查...因爲有任何內置機制(即約束等)或者我們通過每個RentalUnit.reviews集合手動旅行,這可能非常昂貴... – latvian

+0

物理上,'Review'中只有一個對'RentalUnit'的引用。 'belingsTo'創建一個隱式字段,'Review.rentalUnit',您可以查看(http://grails.org/doc/latest/ref/Domain%20Classes/belongsTo.html)。希望我的問題得到了解決。 –

+0

謝謝你Victor。我很感激。英語不是我的第一語言,所以我道歉不能清楚地表達我自己。 RentalUnit中的One-to-Many與ReviewUnit中的One-to-Many之間的關係== RentalUnit中的多對一,對嗎?然而,特定的共享審查指向的不止是一個RentalUnit,除非我們在添加對RentalUnit的審覈時手動執行。這是有道理的嗎?在我的理性中是否有錯誤... ... thnks – latvian

相關問題