Grails: GORM 自動更新儲存問題

Grails 版本: 2.3.5

以下面的程式碼為例,

我們希望找到 author 之後,將 author 存回 book 中,

再呼叫 book 做 save(),

但實測發現 book 在 if 之前就已自動儲存,

book update
1
2
3
4
5
6
7
8
9
def book = Book.get(params.id)
book.properties = params

def author = Author.findByName(params["author.name"])

if(author){
  book.author = author
  book.save()
}

查了一下 Grails API 找到 discard() 方法,用來避免自動執行儲存

測試的程式碼如下,結果 book 仍然自動更新 (暈) ,

book update - test discard
1
2
3
4
5
6
def book = Book.get(params.id)
book.properties = params

def author = Author.findByName(params["author.name"])

book.discard()

繼續 try 不同的組合後發現似乎是 findBy() 指令造成 book 自動儲存

在此提供兩種解決方式,第一種是在 mapping params 之前先執行完 findBy()

book update - solution 1
1
2
3
4
5
6
7
8
9
def author = Author.findByName(params["author.name"])

def book = Book.get(params.id)
book.properties = params

if(author){
  book.author = author
  book.save()
}

若因為處理邏輯的因素 findBy() 一定得在 book.properties = params 之後,

我們可以用第二種方式,使用 new Book(params) 來取代 book.properties = params

book update - solution 2
1
2
3
4
5
6
7
8
9
10
def book = new Book(params)

def author = Author.findByName(params["author.name"])

if(author){
  def book = Book.get(params.id)
  book.properties = params
  book.author = author
  book.save()
}

Comments