【问题标题】:Grails cannot clear a hasMany set using cascadeGrails 无法使用级联清除 hasMany 集
【发布时间】:2016-08-12 18:24:12
【问题描述】:

我试图从userDeptses 集中清除数据,但是当我调用clear() 方法并尝试保存时,我收到以下错误

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

我的级联设置正确,我什至尝试只使用delete-orphan,但仍然有问题。所有相关类都实现了equalshashCode 方法:AppSystemUserUserDeptsDepartment

我在网上阅读的所有文档和文章都说使用clear()all-delete-orphan 的组合应该可以工作,但不适用于我。非常感谢任何帮助。

Grails 3.1.4

控制器:

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

应用系统用户:

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"
}

....

用户部门:

class UserDepts {

Boolean active
AppSystemUser appSystemUser
Department department

static belongsTo = [AppSystemUser, Department]

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

....

用户管理服务:

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

【问题讨论】:

  • 看起来您的 UserDepts 实例仍然有对 Department 的引用。他们也需要清理才能被删除为孤儿
  • @injecteer 我不想删除DepartmentUserDepts 只是将 2 个表连接在一起,但删除连接数据后,AppSystemUserDepartment 数据应保持不变。
  • 我就是这么说的。您的连接表的条目仍然有 1 个末端绑定到 Depatment。这就是保留连接条目的原因。为了删除它们,必须清洁两个关系端

标签: grails grails-orm cascading-deletes


【解决方案1】:

我无法找到如何成功使用 Set 的 clear() 方法,所以我创建了一个简单的解决方法来解决问题

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

只需遍历 Set 并单独删除每个项目。这很完美,每当我需要清除Set时,我只需调用此方法而不是clear()

【讨论】:

    猜你喜欢
    • 2011-08-22
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多