2011-12-02 46 views
0

我有以下域類:爲什麼GORM執行級聯刪除,即使省略belongsTo關鍵字?

假日

class Holiday { 
    String justification 
    User user 
    //static belongsTo = User 
     static constraints = { 
     } 
} 

用戶

class User { 
    String login 
    String password 
    static hasMany = [ holidays : Holiday ] 
     static constraints = { 
    } 
} 

我已經創建HolidayUser之間的一對多關係。請注意,我沒有在Holiday類中包含belongsTo。現在,我寫了下面的集成測試:

void testWithoutBelongsTo() {  
     def user1 = new User(login:"anto", password:"secret") 
     user1.save() 
     def holiday1 = new Holiday(justification:"went to trip") 
     holiday1.save() 
     user1.addToHolidays(holiday1) 
     assertEquals 1, User.get(user1.id).holidays.size() 
     user1.delete() 
     assertFalse User.exists(user1.id) 
     assertFalse Holiday.exists(holiday1.id) 
    } 

顯然,在上述試驗的情況下,我只刪除user1實例,但是當我斷言語句來看,我可以看到GORM已經隱含刪除holiday1,太。我的測試案例有PASSED!儘管我沒有在Holiday類中給出belongsTo關鍵字,但是如何發生這種情況?

我正在使用Grails版本1.3.7。

+1

只是一個建議:使用簡單的Groovy的斷言而不是JUnit的assertEquals,它有更好的錯誤報告。 – Antoine

回答

3

holiday1從未保存,因爲它不驗證:屬性user既不設置也不可空。

這是您在Holiday.groovy代碼如何看起來應該像:

class Holiday { 
    String justification 
    User user 
    //static belongsTo = User 
    static constraints = { 
     user(nullable: true) 
    } 
} 

而且測試,財產user正確設置在holiday1

void testWithoutBelongsTo() 
{ 
    def user1 = new User(login:"anto", password:"secret") 
    user1.save(failOnError: true) 
    def holiday1 = new Holiday(justification:"went to trip", 
           user: user1) // Set user properly 
    holiday1.save(failOnError: true) 
    user1.addToHolidays(holiday1) 
    assert 1, User.get(user1.id).holidays.size() 
    holiday1.user = null // Unset user as otherwise your DB 
          // won't be happy (foreign key missing) 
    user1.delete() 
    assert ! User.exists(user1.id) 
    assert Holiday.exists(holiday1.id) 
} 

爲了消除驗證錯誤迅速在你的測試時,始終使用save(failOnError: true)。如果你的對象沒有驗證,它會拋出一個異常。

+0

+1謝謝你的回答:) –

+0

感謝您使用groovy的'assert'關鍵字。雅,它正在拋出有用的異常消息:D –

0

您應該在將其添加到用戶後節省假期。