2011-05-26 35 views
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的骯髒檢查造成的,這意味着現有的authorbooks集合已經改變並且將被保存,並且該保存被級聯到書實例。

在這種情況下防止Grails保存圖書的最佳方法是什麼?或者爲什麼通過數據綁定完成的關聯在驗證失敗時沒有正確回滾?

回答

0

如果您已指定您的服務是事務性的,則任何未捕獲的異常將導致事務在服務方法內回滾。唯一可能阻礙你的是如果你的RDBMS不支持真正的事務/回滾。

您是否指定了服務是否是事務性的?您應該有如下聲明來聲明服務是事務性的。

def transactional = true 
+1

服務是事務性的,RDBMS是InnoDB的MySQL。所以支持交易。但仍然沒有改變。 – z00bs 2011-05-27 14:40:57