9
votes

Objet supprimé des greils serait ré-enregistré par erreur en cascade

J'ai le projet comme configuré ci-dessous. J'essaie de supprimer un projet et je reçois ce qui suit:

public class Project implements Comparable
{  
    static belongsTo = [employee:Employee]

    static hasMany = [roles:Role]
    static constraints = {

    }
    static mapping = {
          description type:"text"
          roles lazy:false, cascade:"all,delete-orphan"
          client lazy:false, cascade:"all,delete-orphan"
          employer lazy:false, cascade:"all,delete-orphan"
    }
}


class Employee implements Comparable
{
    static hasMany = [employeeDesiredSkills:EmployeeDesiredSkill,
                      employeeDesiredTools:EmployeeDesiredTool,
                      employeeAreasOfExpertise:EmployeeAreaOfExpertise,
                      projects:Project,
                      education:Education]


    static mapping = {
           employeeDesiredSkills cascade:"all,delete-orphan", lazy:false
           employeeDesiredTools cascade:"all,delete-orphan", lazy:false
           education cascade:"all,delete-orphan", lazy:false
           projects cascade:"all,delete-orphan", lazy:false
    }
}

public class Role implements Comparable
{

    static belongsTo = [project:Project]
    static hasMany = [roleSkills:RoleSkill,roleTools:RoleTool]

    static mapping = {
        duties type:"text"
        roleSkills cascade:"all,delete-orphan", lazy:false
        roleTools cascade:"all,delete-orphan", lazy:false
        locationType cascade:"all,delete-orphan", lazy:false

    }

    static contraints = {
        endDate(nullable: true)
        roleSkills(nullable: true)
        roleTools(nullable: true)
    }
}

class Employer implements Comparable
{
   static mapping = {
       type lazy:false, cascade:"all,delete-orphan"
   }
}

class RoleTool implements Comparable    
{


  static belongsTo = [role:Role, tool:Tool]//not sure this makes sense, but have to leave it or DB breaks
  Tool tool = new Tool(name:"")
    static mapping = {
      tool cascade:"save-update", lazy:false

    }


class RoleSkill implements Comparable   
{

  static belongsTo = [role:Role, skill:Skill]//not sure this makes sense, but have to leave it or DB breaks
    Skill skill = new Skill(name:"")
    static mapping = {
       skill cascade:"save-update", lazy:false

    }
}

class Skill implements Comparable
{
    static hasMany = [roleSkills:RoleSkill, employeeDesiredSkills:EmployeeDesiredSkill]

    static mapping = {
        roleSkills cascade:"all,delete-orphan", lazy:false
        employeeDesiredSkills cascade:"all,delete-orphan", lazy:false

    }

}

class Tool implements Comparable
{

    static hasMany = [roleTools:RoleTool, employeeDesiredTools:EmployeeDesiredTool]

    static mapping = {
        roleTools cascade:"all,delete-orphan", lazy:false
        employeeDesiredTools cascade:"all,delete-orphan", lazy:false

    }
}


0 commentaires

3 Réponses :


0
votes

Si vous avez cascade pour la configuration de Supprimer, vous devez supprimer l'objet à la suppression de son parent avant de la supprimer. De votre stacktrace dans ProcecController autour de la ligne 50.


2 commentaires

Lorsque vous dites "objet à supprimer de son parent", cela signifie-t-il que pour cet examen, je dois supprimer le projet de l'employé ou dois-je expliquer explicitement baisser l'arbre en supprimant tous les objets TAHT sur le point d'être supprimé de leurs parents?


Voici comment je faisais la suppression du projetController: DEF EMPLOYER = projet.employé; employé.removefromProjects (projet); projet.Delete (flush: vrai)




6
votes

Je sais que c'est tard mais que quelqu'un aimerait trouver ceci ici: Ce qui se passe, c'est que Hibernate utilise "DirtyChecking", comme expliqué dans Gorm Gotchas de Peter Ledbrook .

faire des choses courtes: Hibernate, et donc greils voudra sauvegarder () code> l'objet code> Employee code> à la fin de la session hibernate (dans votre cas au .Delete (Flush: True ) code> appel) car il détecte que l'objet a été modifié (un projet code> a été supprimé). Et l'employé code> doit avoir conservé un lien vers le projet code> code>, provoquant la sensation d'hibernation de votre Supprimer () code> le projet code > Pour sauvegarder () code> retour à nouveau. P>

Solution de contournement Ceci: P>

 def employee = project.employee; 
 employee.discard(); 
 project.delete(flush:true);


0 commentaires