나는 내가 생각하는 것은 간단한 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() 작업의 일부만 죽이는 것이고 모든 것이 아닌 것은 사실입니까? 그리고 어떻게해야합니까?
(올바르게) 발급 된 업데이트가 고유성 제약 조건을 위반하지 않으므로 나는 특별한 코드가 필요하지 않습니다. 그래서 문제는 사라졌지 만, beforeInsert()의 동작은 여전히 의문의 여지가 있습니다. – Jay
새로운 UserGroup 객체를 멤버로 저장하고 beforeInsert가 '중복 이름 때문에 실패합니다 .'는 부모 레코드가 없으므로 실패합니다. ... 왜 부모가 없습니까? beforeInsert에 의해 당신이 제안한 것처럼'duplicate '로 잡혀서이기 때문입니다. 현재 질문에 가치가 있는지 확실하지 않습니다. 부모가 되어도 복제본이 될 수 없기 때문에 이제는 1 대신에 두 테이블을 모두 롤백해야합니다. – Vahid