2013-10-25 58 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 –

相關問題