2016-12-20 8 views
0

나는 내가 생각하는 것은 간단한 hasMany의 조합이었다가 - 사용자 그룹 hasMany의 사용자 및 사용자 그룹은 사용자가 소유 :Grails 3 beforeInsert() 관련 삽입을 중지하지 않습니까?

class UserGroup { 

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

좋아 지금까지. 나는 주인마다 고유하게 이름을 원했다, 그래서 원래 이름 제약 조건을 넣어 :

name unique: 'owner' 

그러나,이 또한 같은 이름의 업데이트를 방지. 그래서 beforeInsert에 제약을 이동 expicitly 로직을 실행 한 후 b)는 멤버를 삽입) 회원들과 새로운 사용자 그룹 객체를 저장하고, beforeInsert이 통과 할 때

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() 
} 

, 나는이에 최대 절전 모드 작업을 볼 수있는 사용자 그룹을 삽입 .

구성원이있는 새 UserGroup 개체를 저장하고 beforeInsert가 중복 된 이름으로 인해 실패하면 멤버를 삽입하기위한 최대 절전 모드 동작 만 표시됩니다. 부모 레코드가 없기 때문에 이것은 물론 실패합니다.

내가 잘못하고있는 건가요, 아니면 beforeInsert가 save() 작업의 일부만 죽이는 것이고 모든 것이 아닌 것은 사실입니까? 그리고 어떻게해야합니까?

+0

(올바르게) 발급 된 업데이트가 고유성 제약 조건을 위반하지 않으므로 나는 특별한 코드가 필요하지 않습니다. 그래서 문제는 사라졌지 만, beforeInsert()의 동작은 여전히 ​​의문의 여지가 있습니다. – Jay

+0

새로운 UserGroup 객체를 멤버로 저장하고 beforeInsert가 '중복 이름 때문에 실패합니다 .'는 부모 레코드가 없으므로 실패합니다. ... 왜 부모가 없습니까? beforeInsert에 의해 당신이 제안한 것처럼'duplicate '로 잡혀서이기 때문입니다. 현재 질문에 가치가 있는지 확실하지 않습니다. 부모가 되어도 복제본이 될 수 없기 때문에 이제는 1 대신에 두 테이블을 모두 롤백해야합니다. – Vahid

답변

0

beforeInsert의 코드는 사용자 정의 유효성 검사기에 있어야하지만 고유 한 이름을 확인하므로 올바른 제약 조건은 고유 한 이름이어야합니다. true ('owner'는 유효하지 않으므로 고유 한 이름이 확실하지 않습니다. 값은 사양 https://docs.grails.org/latest/guide/validation.html)

그리고에 부울해야 당신이 문서에 지정된 매핑 필드에 지정 될 수 캐스케이드에 저장하는 그룹의 사용자에게 원하는 경우 https://docs.grails.org/latest/ref/Database%20Mapping/cascade.html

하는 경우 사용자 정의 유효성 검사기가 실패하거나 고유성 만 실패하면 계단식 저장/업데이트가 실행되지 않아야합니다.