2016-08-12 6 views
0

나는 userDeptses 세트에서 데이터를 삭제하려고 사용하여 hasMany의 세트를 지울 수 없습니다하지만 난 clear() 메서드를 호출하려고 할 때이Grails는 캐스케이드

Caused by: java.lang.UnsupportedOperationException: queued clear cannot be used with orphan delete

내가 가진 다음과 같은 오류가 저장 계단식 세트 제대로, 심지어 그냥 delete-orphan를 사용하여 노력했지만 여전히 문제가 있습니다. AppSystemUserUserDeptsDepartment

모든 문서 및 기사 나는 온라인 읽고는 clear()all-delete-orphan의 조합을 사용하는 것은,하지만 나를 위해 작동하도록되어 있다고 : 모든 관련 클래스가 구현 equalshashCode 방법이있다. 어떤 도움이라도 대단히 감사합니다.

Grails의 3.1.4

컨트롤러 :

AppSystemUser user = AppSystemUser.findBySystemUserid(cmd.netid); 
user.userDeptses.clear(); 
userMgmtService.saveAppSystemUser(user); 

AppSystemUser :

class AppSystemUser { 

String systemUserid 
String email 
String fullName 
Date lastLogin 
Boolean active 
Set appSystemUserRoles = []; 
Set userCollegeses = []; 
Set userDeptses = []; 

static hasMany = [appSystemUserRoles: AppSystemUserRole, 
        applicationExtensions: ApplicationExtension, 
        userCollegeses: UserColleges, 
        userDeptses: UserDepts] 

static mapping = { 
    version false 
    fullName column: 'fullName' 
    lastLogin column: 'lastLogin' 
    id name: "systemUserid", generator: "assigned" 
    appSystemUserRoles cascade: "save-update, all-delete-orphan" 
    userCollegeses cascade: "save-update, all-delete-orphan" 
    userDeptses cascade: "save-update, all-delete-orphan" 
} 

.... 

UserDept :

class UserDepts { 

Boolean active 
AppSystemUser appSystemUser 
Department department 

static belongsTo = [AppSystemUser, Department] 

static mapping = { 
    version false 
    appSystemUser column: "system_userid" 
} 

.... 

는 UserMgmtService :

@Transactional 
class UserMgmtService { 
    def saveAppSystemUser(AppSystemUser user) { 
     user.save(); 
    } 
} 
+0

처럼 'UserDepts' 인스턴스에는 여전히'Department'에 대한 참조가 있습니다. 고아처럼 지워지려면 청소를해야합니다. – injecteer

+0

@injecteer 'Department'를 삭제하려고하지 않습니다. 'UserDepts'는 2 개의 테이블을 함께 조인하지만 Join 데이터를 삭제 한 후에는'AppSystemUser' 및'Department' 데이터는 그대로 유지해야합니다. –

+0

그것이 내가 말한 것입니다. 조인 테이블의 항목에는 여전히 Depatment에 바인딩 된 1 개의 끝이 있습니다. 그 이유는 조인 항목이 유지되는 이유입니다. 그들을 제거하기 위해서는 양쪽 관계면을 청소해야합니다 – injecteer

답변

0

나는 그래서 난 그냥 트릭

def static hibernateSetClear(Set data) { 
    if(data) { 
     Iterator i = data.iterator(); 
     while (i.hasNext() && i.next()) { 
      i.remove(); 
     } 
    } 
} 
을 수행하는 간단한 해결 방법을 만들어 성공적으로 설정의 clear() 방법을 사용하는 방법을 찾을 수 없습니다

Set을 반복하고 각 항목을 개별적으로 제거하십시오. 이것은 완벽하게 작동하며 나는이 메소드를 clear() 대신에 호출해야합니다. Set