2013-10-28 26 views
0
Grails領域級

我有以下的類()函數:改寫刪除

class User { 
String name 
} 

class Book { 
    User user 
} 

我想,如果我刪除一個用戶對象時,它也刪除包含用戶實例Book對象。由於我沒有從User類到書級的關係級聯刪除不起作用。

我寫的書類如:

class Book { 
    belongsTo = [user: User] 
} 

前者還沒有做級聯刪除,因爲還沒有在User類中定義的關係。

我所做的是以下幾點:

class User { 
String name 

def deleteUser() { 
    def books = Book.findAllByUser(this) 
    books.each { it.delete(flush: true) } 
} 
delete(flush: true) 
} 

我不認爲這是最好的解決辦法。我能做些什麼呢?有沒有辦法以某種方式擴展User類的delete()函數?

我嘗試了以下,但它失敗。

def delete() { 
    def books = Book.findAllByUser(this) 
    books.each { it.delete(flush: true) } 
} 
super.delete(flush: true) 

回答

0

這是業務邏輯滿足Service類內部事務的地方。這是因爲你已經定義它,我會怎麼做,如果我使用的關係:

def UserService { 

    static transactional = true 

    def delete(Long userId) { 
     def user = User.get(userId) 
     def userBooks = Book.findAllByUser(user) 
     userBooks*.delete() 
     user.delete() 
    } 

} 

然後就是從控制器調用這個服務。

可以說,如果一本書確實屬於用戶,定義關係的雙方,它應該級聯。

+0

你會使用delete(flush:true)還是不使用flush?你爲什麼不把這種方法放在模型中? – confile

+0

我在交易中處理時通常不使用刷新。特別是當多個域被操縱時。我沒有把它放在模型中,因爲我想要事務控制,並且我不是模型中那種業務邏輯的忠實粉絲。 – Gregg

+0

事務控制意味着一切都發生在一個事務中?這在模型中是不可能的嗎? – confile