2013-10-25 33 views
2

我想从另一个“状态”基础上删除几个对象。我不断收到“删除的对象将被重新保存级联...”错误。Grails错误 - 删除对象将被重新保存

我已经搜索这个问题,阅读所有帖子,尝试了各种建议,但仍然无法使其工作。

我有两个互相引用的域。这是代码。希望有人能告诉我我做错了什么。而且,我是Grails的新人。如果它倾倒在我身上,所以我还在学习。

class Room {  
    static def hasMany = [devices : Device] 
    static def hasOne = [status: RoomStatus] 
    Integer roomId 
    String name 
    static constraints = { 
     roomId unique: true 
    } 
    static mapping = { 
     devices sort:'id', order: 'asc' 
    } 
} 
class Device { 
    static def belongsTo = [room: Room] 
    static def hasOne = [status: DeviceStatus] 
    Integer deviceId 
    String name 
    static constraints = { 
     deviceId nullable: true, unique: true 
    } 
    static mapping = { 
    } 
} 

下面是我用来从房间中删除“已删除”状态的所有设备的方法。它是在房间控制器:

def removeDeletedDevices(Long id) { 
    def roomInstance = Room.get(id) 
    if (!roomInstance) { 
     // redirect to error page 
     return 
    } 
    for (def device : roomInstance.devices) { 
     if (true == device.status.toString().equals("Deleted")) { 
      try { 
       device.delete(flush: true) 
      } catch (DataIntegrityViolationException e) { 
       // report error 
       break; 
      } 
     } 
    } 
    // redirect to report page. 
} 

我之前删除试图

  • roomInstance.removeFromDevices(设备)。
  • beforeDelete在设备控制器

至今没有运气。我究竟做错了什么?

+0

可能重复[这里](http://stackoverflow.com/a/17412425/2051952)。 – dmahapatro

回答

2

您应该配置关联的级联行为。添加devices cascade:"all-delete-orphan"mapping

class Room {  
    static def hasMany = [devices : Device] 

    static constraints = { 
     ...... 
    } 
    static mapping = { 
     devices cascade:"all-delete-orphan" 
     ...... 
    } 
} 

而且在操作使用下面的代码片段进行删除。

EDITED

def devices = Device.findAllByStatusAndRoom("Deleted", roomInstance) 
devices.each { 
    roomInstance.removeFromDevices(it) 
} 
+0

你是说用“roomInstance.removeFromDevices(device)”代替“device.delete(flush:true)”吗?或者两者都做(removeFrom在删除之前) 我把“roomInstance.removeFromDevices(device) “在device.delete()之前的循环中,并得到一个ConcurrentModificationException错误,我在想这些,我有一个”设备“列表的句柄,这个”removeFrom“试图修改它吗? –

+0

替换设备。删除(flush:true)与roomInstance.removeFromDevices(设备) – emilan

+1

谢谢。在我将该方法移至设备控制器并为findAllByStatusAndRoom执行了DeviceStatus.findByName(“Deleted”)之后,此工作起作用。 谢谢您对你的帮助非常重要你已经让我的星期五结束了愉快的笔记 Ch eers –

相关问题