J'ai une relation un-à-plusieurs et lorsque j'essaie de supprimer un parent qui a plus d'un enfant, l'événement berforeInsert est appelé sur le premier enfant. J'ai un code dans cet événement que je veux appeler avant d'insérer un enfant, pas quand je supprime le parent! des idées sur ce qui pourrait être faux?pourquoi quand je supprime un parent sur une relation de un à plusieurs sur les grails l'événement beforeInsert est appelé sur l'enfant?
les entités:
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()
}
}
}
Montrez vos entités et l'association –
montrant maintenant mes entités. parent: MenuItem, enfants: MenuItemExtra – nico