0

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() 
      }  

     } 



    } 
+0

Montrez vos entités et l'association –

+0

montrant maintenant mes entités. parent: MenuItem, enfants: MenuItemExtra – nico

Répondre

0

Je crois que mon erreur a à voir avec le afterDelete du « beaucoup côté » de la relation. Parce que sur l'afterDelete je modifie les autres entités qui ont le même parent, puis appelle la méthode save() qui pourrait déclencher le beforeInsert. Peut-être que j'ai une erreur conceptuelle et la modification des enitités avec le même parent, après une seule suppression de l'un d'eux doit être fait quelque part d'autre ... je ne sais pas.