我有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/