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 } }
3 Réponses :
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. P>
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)
Enfait, la façon dont vous avez fait la cartographie
Vous devez juste avoir besoin de faire: p> et le projet sera supprimé aussi.
Pour plus de détails, reportez-vous à Gorm Gotchas de Peter Ledbrook a >.
Sa série 3 parties et explique de nombreuses situations similaires p> p> Projets Cascade: "Tous, Supprimer-orphelin" Code>
Dans la classe d'employés.
Je l'ai enfin fini. Il n'enfait pas cela simple. Je pense qu'il y a un bogue de grails si les projets sont stockés dans le tri, alors il a du mal à faire cela supprimer. Je devais faire une copie des projets, supprimer celui que je voulais supprimer, puis les ajouter à un employé pour que cela fonctionne.
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 Solution de contournement Ceci: P> 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é
Supprimer () code> le projet
code > Pour
sauvegarder () code> retour à nouveau. P>
def employee = project.employee;
employee.discard();
project.delete(flush:true);