2010-09-29 18 views
6

Tôi có dự án như được thiết lập dưới đây. Tôi đang cố gắng xóa một dự án và tôi nhận được những điều sau đây:đối tượng bị xóa grails sẽ được lưu lại bằng lỗi ghép tầng

2010-09-29 11:45:22,902 [http-8080-1] ERROR errors.GrailsExceptionResolver - deleted object would be re-saved by cascade (remove deleted object from associatio 
ns): [Project#204] 
org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations): [Project#204] 
     at ProjectController$_closure6.doCall(ProjectController:50) 
     at ProjectController$_closure6.doCall(ProjectController) 
     at org.jsecurity.web.servlet.JSecurityFilter.doFilterInternal(JSecurityFilter.java:382) 
     at org.jsecurity.web.servlet.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:180) 
     at java.lang.Thread.run(Thread.java:619) 

Có cách nào để ngủ đông cho tôi biết đối tượng nào có tham chiếu về đối tượng Dự án sẽ được lưu lại hay không. Điều gì là sai với dự án của tôi thiết lập được gây ra ngoại lệ tròn này?

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 

    } 
} 

Trả lời

9

Infact, cách bạn đã thực hiện ánh xạ projects cascade:"all,delete-orphan" trong lớp nhân viên.

Bạn sẽ chỉ cần làm:

def employee = project.employee; 
employee.removeFromProjects(project); 

Và dự án sẽ bị xóa theo. Để biết thêm chi tiết, hãy tham khảo GORM Gotchas By Peter Ledbrook. của một loạt 3 phần và giải thích nhiều tình huống tương tự

+2

Cuối cùng tôi đã làm việc đó. Nó không phải là infact đơn giản. Tôi nghĩ rằng có một lỗi grails nếu các dự án được lưu trữ trong SortedSet, sau đó nó có một thời gian khó làm điều đó loại bỏ. Tôi phải tạo một bản sao của các dự án, xóa một bản sao mà tôi muốn xóa, sau đó thêm chúng lại cho nhân viên để làm việc này – Derek

0

nếu bạn có thác để xóa thiết lập, như bạn làm, bạn cần phải xóa đối tượng cần xóa khỏi cha mẹ trước khi xóa. Từ stacktrace của bạn trong ProcectController xung quanh dòng 50.

+0

khi bạn nói "đối tượng cần xóa khỏi cha mẹ", điều đó có nghĩa là đối với kỳ thi này, tôi cần xóa Project khỏi nhân viên, hoặc tôi phải đi xuống cây xóa tất cả các đối tượng đã bị xóa khỏi cha mẹ? – Derek

+0

Đây là cách tôi đã làm việc loại bỏ khỏi ProjectController: def employee = project.employee; \t employee.removeFromProjects (dự án); project.delete (flush: true) – Derek

5

Tôi biết nó là muộn nhưng ai đó có thể muốn tìm thấy điều này ở đây: gì xảy ra là Hibernate sử dụng 'dirtyChecking', như được giải thích trong GORM Gotchas By Peter Ledbrook.

Để làm cho mọi việc ngắn: Hibernate, và vì vậy Grails sẽ muốn save() đối tượng employee vào cuối phiên Hibernate (trong trường hợp của bạn tại .delete(flush:true) cuộc gọi) bởi vì nó phát hiện rằng đối tượng đã được sửa đổi (một project đã bị đàn áp). Và employee phải giữ liên kết về phía project, khiến Hibernate cảm thấy bạn sẽ delete()project để save() nó trở lại.

Để workaround này:

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

này nói cho Hibernate không save() các employee mà bạn không yêu cầu nó.

Các vấn đề liên quan