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);