我试图根据" status"从另一个中删除多个对象。我一直得到"已删除的对象将通过级联重新保存..."错误。
我已经搜索过这个问题,阅读了所有帖子,尝试了各种建议,但仍然无法让它发挥作用。
我有两个相互引用的域名。这是代码。希望有人可以告诉我我做错了什么。而且,我是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.
}
我已经尝试了
到目前为止没有运气。我做错了什么?
答案 0 :(得分: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)
}