2016-08-12 4 views
0

Я пытаюсь очистить данные из userDeptses набора, но когда я вызываю метод clear() и попытаться сохранить я получаю следующее сообщение об ошибкеGrails не может очистить набор hasMany с помощью каскадного

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

У меня есть каскадный набор правильно, я даже пытался использовать только delete-orphan, но все еще есть проблемы. Все соответствующие классы equals и hashCode методы, реализованные: AppSystemUserUserDeptsDepartment

Вся документация и статьи, которые я прочитал в Интернете говорят, что с помощью комбинации clear() и all-delete-orphan должен работать, но не для меня. Любая помощь приветствуется.

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 Я не пытаюсь удалить «Департамент». 'UserDepts' просто соединяет две таблицы вместе, но данные' AppSystemUser' и 'Department' должны оставаться неповрежденными после удаления данных объединения. –

+0

вот что я сказал. записи вашей таблицы объединений все еще имеют 1 конец, привязанный к Depatment. поэтому записи соединения сохраняются. для их удаления обе стороны должны быть очищены – injecteer

ответ

0

я не смог узнать, как успешно использовать clear() метод набора, так что я просто создал простой обходной путь, который делает трюк

def static hibernateSetClear(Set data) { 
    if(data) { 
     Iterator i = data.iterator(); 
     while (i.hasNext() && i.next()) { 
      i.remove(); 
     } 
    } 
} 

Просто переберитесь через Set и удалите каждый пункт отдельно. Это работает отлично, и я просто называю этот метод вместо clear() всякий раз, когда мне нужно очистить Set