为什么当我删除 grails 上一对多关系上的父级时,会在子级上调用 beforeInsert 事件?
我有一对多关系,当我尝试删除具有多个子项的父项时,第一个子项会调用 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()
}
}
}
I have a one to many relationship and when I try to delete a parent that haves more than one child the berforeInsert event gets called on the frst child. I have some code in this event that I mean to call before inserting a child, not when i'm deleting the parent! any ideas on what might be wrong?
the entities:
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()
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我相信我的错误与删除关系的“多方”有关。因为在 afterDelete 上,我修改了具有相同父级的其他实体,然后调用可能触发 beforeInsert 的 save() 方法。
也许我有一个概念错误,并且修改具有同一父级的实体,在删除其中一个实体后必须在其他地方完成......我不知道。
I believe my mistake has to do with the afterDelete of the "many side" of the relationship. Because on the afterDelete I modify the other entities that have the same parent and then call the save() method that might be triggering the beforeInsert.
Maybe I have a conceptual mistake and the modifying of enitities with the same parent, after a single deletion of one of them has to be done some where else...i don't know.