1
鑑於以下兩個領域類結合進行回滾協會:的Grails:通過數據服務
class Book {
String title
static hasMany = [authors: Author]
static belongsTo = Author
static constraints = {
title(nullable: false)
}
}
class Author {
static hasMany = [books: Books]
}
我們創造並在堅持服務域對象並使用數據綁定的Grails的功能。這種方法類似於以下之一:
def createAndPersistBook(params) throws ValidationException {
log.debug("Attempt to create and persist book")
Book book = new Book(params)
book.save(flush: true, failOnError: true)
log.debug("Created: ${book}")
book
}
當我們通過params
地圖
params = ["authors": "[2]"]
到服務方法(不存在所定義從而驗證將失敗標題)從新創建的關聯書到現有的作者(反之亦然)是通過數據綁定完成的。但由於標題爲nullable: false
而未定義,因此將拋出ValidationException
並且事務回滾。
我們現在預期的是該書不會被保存,但Book.list().isEmpty()
返回false。我們認爲這是由於hibernate的骯髒檢查造成的,這意味着現有的author
的books
集合已經改變並且將被保存,並且該保存被級聯到書實例。
在這種情況下防止Grails保存圖書的最佳方法是什麼?或者爲什麼通過數據綁定完成的關聯在驗證失敗時沒有正確回滾?
服務是事務性的,RDBMS是InnoDB的MySQL。所以支持交易。但仍然沒有改變。 – z00bs 2011-05-27 14:40:57