2016-12-20 43 views
0

我有我的想法是一個簡單的hasMany的關聯 - 一個用戶組的用戶的hasMany和用戶組的用戶擁有:Grails 3 beforeInsert()不停止關聯插入?

class UserGroup { 

    String name 
    User owner 
    Set members = [] 
    static hasMany = [members: User] 
    ... 
} 

精細至今。我想的名字是每個業主唯一的,所以最初把約束的名字:

name unique: 'owner' 

然而,這也防止了同一名稱的更新。讓我感動的約束beforeInsert和expicitly執行邏輯:

def beforeInsert() { 
    boolean existing = false 
    UserGroup.withNewSession { 
     existing = UserGroup.where { 
      owner == this.owner && name == this.name 
     }.count() > 0 
    } 
    if (existing) { 
     this.errors.rejectValue(...) 
    } 
    return !this.hasErrors() 
} 

當保存所有的成員一個新的用戶組對象,beforeInsert的推移,我看到了休眠行動a)將用戶組則b)插入成員。

當使用成員保存新的UserGroup對象,並且由於名稱重複而導致beforeInsert失敗時,我只能看到用於插入成員的休眠操作。當然,這是因爲沒有父記錄。

我做錯了什麼,或者是真的,beforeInsert只是殺死部分save()操作而不是整個事情?那該怎麼辦?

+0

回答時,我不應該需要任何特殊的代碼,因爲(正確)發佈的更新不會違反唯一性約束。所以問題已經消失,但我認爲beforeInsert()的行爲仍然存在疑問。 – Jay

+0

使用成員保存新的UserGroup對象時,beforeInsert由於重複的名稱而失敗,這當然會失敗,因爲沒有父記錄。......爲什麼沒有父項?是因爲它被beforeInsert抓到了,就像你所說的那樣,它是一個「重複」的東西。不確定您目前的問題是否有任何價值。因爲即使它有父母,它不能因爲它是一個重複它不得不回滾兩個表,而不是1,因爲現在 – Vahid

回答

0

beforeInsert上的代碼應該位於自定義驗證器上,但它正在檢查唯一的名稱,所以正確的約束應該只是名稱唯一:true(不確定是什麼名稱unique:'owner',因爲它是無效的,該值應在規範https://docs.grails.org/latest/guide/validation.html

而且是布爾值,如果你想給用戶組被保存在級聯,可以在測繪領域上的文檔所規定指定在https://docs.grails.org/latest/ref/Database%20Mapping/cascade.html

如果自定義驗證器失敗,或者只是唯一失敗,則不應執行級聯保存/更新。