【问题标题】:Grails error - deleted object would be re-savedGrails 错误 - 已删除的对象将被重新保存
【发布时间】:2013-10-25 21:09:25
【问题描述】:

我正在尝试根据“状态”从另一个对象中删除几个对象。我不断收到“已删除的对象将被级联重新保存...”错误。

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

我有两个相互引用的域。这是代码。希望有人能告诉我我做错了什么。而且,我是 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 = {
    }
}

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

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(device) 前删除。
  • 在设备控制器中删除之前

到目前为止没有运气。我做错了什么?

【问题讨论】:

标签: grails groovy


【解决方案1】:

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

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

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

并在实际操作中使用以下 sn-p 进行删除。

已编辑

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

【讨论】:

  • 你是说用“roomInstance.removeFromDevices(device)”替换“device.delete(flush: true)”吗?或者两者都做(删除之前的removeFrom)。我把“roomInstance .removeFromDevices(device)" 在 device.delete() 之前的循环中并得到 ConcurrentModificationException 错误。我想知道。我有一个“设备”列表的句柄,这个“removeFrom”正在尝试修改它?
  • 将 device.delete(flush: true) 替换为 roomInstance.removeFromDevices(device)
  • 谢谢。这在我将方法移至设备控制器并为 findAllByStatusAndRoom 执行 DeviceStatus.findByName("Deleted") 后起作用。非常感谢您的帮助。你让我的星期五以更愉快的方式结束。干杯
猜你喜欢
  • 2013-11-26
  • 2011-04-19
  • 2019-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多