grails - 删除之前与多对多关系

标签 grails many-to-many gorm cascading-deletes

我有2域类,具有多对多关系。删除属于另一个实体的实体时,必须先删除该关系以避免外键错误。

我想将此代码放在beforeDelete事件中,但是我遇到了乐观锁定问题。这是域类的代码:

class POI {

    static belongsTo = [Registration];

    static hasMany = [registrations: Registration]


    def beforeDelete = {
        def poiId = this.id
        POI.withNewSession { session ->
            def regs = Registration.withCriteria{
                pois{
                    idEq(this.id)
                }
            }

            def poi = POI.get(poiId)
                if(poi != null && regs.size() > 0){
                    regs.each{
                        it.removeFromPois(poi)
                    }
                    poi.save(flush: true)
                }
            }
        }
    }
}


class Registration {

    static hasMany=[pois: POI];

}

因此,当我在poi上调用delete时,在beforeDelete中会删除POI和注册之间的关系,但是当它尝试有效执行删除时,我将遇到以下错误:
optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException:
Row was updated or deleted by another transaction (or unsaved-value mapping was 
incorrect): [ambienticwebsite.POI#22]

任何人都知道如何通过使用beforeDelete解决此问题?

最佳答案

在大多数情况下,使用GORM时,如果不手动创建代表联接表的类来处理多对多关系,则会造成很多麻烦。

一个示例是Spring Security Core Plugin's PersonAuthority class

一个多对多的示例,其中删除任一端也会删除联接条目:

class POI {
    def beforeDelete() {
        RegistrationPOI.withNewSession {
            def rps = RegistrationPOI.findByPOI(this)
            rps.each { it.delete(flush: true) } // flush is necessary
        }
    }

    /* example convenience method to get directly
     * from a POI to the associated Registrations */
    Collection<Registration> getRegistrations() {
        RegistrationPOI.findByPOI(this)
    }
}

class Registration {
    def beforeDelete() {
        RegistrationPOI.withNewSession {
            def rps = RegistrationPOI.findByRegistration(this)
            rps.each { it.delete(flush: true) } // flush is necessary
        }
    }
}

class RegistrationPOI {
    Registration registration
    POI poi
}

关于grails - 删除之前与多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16986285/

相关文章:

hibernate - Grails-java.lang.IllegalStateException:无法初始化代理

sql - 查询是否存在多个多对多关系

java - 在jpa多对多中合并连接表中的额外列

mysql - 在 MySql 中过滤子查询的结果

grails - Grails 3/GORM-记录更改时的日志条目

unit-testing - 使用复合键的Grails单元测试

grails - 带有URL的Grails中的HTTP GET请求

java - 如何在 Grails 或 Java 应用程序中轻松实现 "who is online"?

grails - Grails:仅在全部通过验证后才能将 parent 和子女保存到数据库的方法

hibernate - 带有Criteria的Grails,或者一种按预定顺序排序的快速方法