为啥当我在 grails 上删除一对多关系上的父级时,会在子级上调用 beforeInsert 事件?
Posted
技术标签:
【中文标题】为啥当我在 grails 上删除一对多关系上的父级时,会在子级上调用 beforeInsert 事件?【英文标题】:why when I delete a parent on a one to many relationship on grails the beforeInsert event is called on the child?为什么当我在 grails 上删除一对多关系上的父级时,会在子级上调用 beforeInsert 事件? 【发布时间】:2010-05-07 17:37:19 【问题描述】:我有一对多的关系,当我尝试删除有多个孩子的父母时,第一个孩子会调用 berforeInsert 事件。在此事件中,我有一些代码,我的意思是在插入孩子之前调用,而不是在我删除父对象时调用!关于什么可能是错的任何想法?
实体:
class MenuItem
static constraints =
name(blank:false,maxSize:200)
category()
subCategory(nullable:true, validator:
val, obj ->
if(val == null)
return true
else
return obj.category.subCategories.contains(val)? true : ['invalid.category.no.subcategory']
)
price(nullable:true)
servedAtSantaMonica()
servedAtWestHollywood()
highLight()
servedAllDay()
dateCreated(display:false)
lastUpdated(display:false)
static mapping =
extras lazy:false
static belongsTo = [category:MenuCategory,subCategory:MenuSubCategory]
static hasMany = [extras:MenuItemExtra]
static searchable =
extras component: true
String name
BigDecimal price
Boolean highLight = false
Boolean servedAtSantaMonica = false
Boolean servedAtWestHollywood = false
Boolean servedAllDay = false
Date dateCreated
Date lastUpdated
int displayPosition
void moveUpDisplayPos()
def oldDisplayPos = MenuItem.get(id).displayPosition
if(oldDisplayPos == 0)
return
else
def previousItem = MenuItem.findByCategoryAndDisplayPosition(category,oldDisplayPos - 1)
previousItem.displayPosition += 1
this.displayPosition = oldDisplayPos - 1
this.save(flush:true)
previousItem.save(flush:true)
void moveDownDisplayPos()
def oldDisplayPos = MenuItem.get(id).displayPosition
if(oldDisplayPos == MenuItem.countByCategory(category) - 1)
return
else
def nextItem = MenuItem.findByCategoryAndDisplayPosition(category,oldDisplayPos + 1)
nextItem.displayPosition -= 1
this.displayPosition = oldDisplayPos + 1
this.save(flush:true)
nextItem.save(flush:true)
String toString()
name
def beforeInsert =
displayPosition = MenuItem.countByCategory(category)
def afterDelete =
def otherItems = MenuItem.findAllByCategoryAndDisplayPositionGreaterThan(category,displayPosition)
otherItems.each
it.displayPosition -= 1
it.save()
class MenuItemExtra
static constraints =
extraOption(blank:false, maxSize:200)
extraOptionPrice(nullable:true)
static searchable = true
static belongsTo = [menuItem:MenuItem]
BigDecimal extraOptionPrice
String extraOption
int displayPosition
void moveUpDisplayPos()
def oldDisplayPos = MenuItemExtra.get(id).displayPosition
if(oldDisplayPos == 0)
return
else
def previousExtra = MenuItemExtra.findByMenuItemAndDisplayPosition(menuItem,oldDisplayPos - 1)
previousExtra.displayPosition += 1
this.displayPosition = oldDisplayPos - 1
this.save(flush:true)
previousExtra.save(flush:true)
void moveDownDisplayPos()
def oldDisplayPos = MenuItemExtra.get(id).displayPosition
if(oldDisplayPos == MenuItemExtra.countByMenuItem(menuItem) - 1)
return
else
def nextExtra = MenuItemExtra.findByMenuItemAndDisplayPosition(menuItem,oldDisplayPos + 1)
nextExtra.displayPosition -= 1
this.displayPosition = oldDisplayPos + 1
this.save(flush:true)
nextExtra.save(flush:true)
String toString()
extraOption
def beforeInsert =
if(menuItem)
displayPosition = MenuItemExtra.countByMenuItem(menuItem)
def afterDelete =
def otherExtras = MenuItemExtra.findAllByMenuItemAndDisplayPositionGreaterThan(menuItem,displayPosition)
otherExtras.each
it.displayPosition -= 1
it.save()
【问题讨论】:
显示您的实体和关联 现在显示我的实体。父项:MenuItem,子项:MenuItemExtra 【参考方案1】:我相信我的错误与关系的“多方”的 afterDelete 有关。因为在 afterDelete 上,我修改了具有相同父级的其他实体,然后调用了可能触发 beforeInsert 的 save() 方法。
也许我有一个概念上的错误并且修改了具有相同父级的实体,在一次删除其中一个之后必须在其他地方完成......我不知道。
【讨论】:
以上是关于为啥当我在 grails 上删除一对多关系上的父级时,会在子级上调用 beforeInsert 事件?的主要内容,如果未能解决你的问题,请参考以下文章