我遇到了grails的问题。我有一个看起来像这样的域名:
class Book {
static belongsTo = Author
String toString() { title }
Author bookAuthor
String title
String currentPage
static constraints = {
bookAuthor()
title(unique:true)
currentPage()
}
}
需要注意的是,我有标题(唯一:true),以避免两次添加同一本书。但是,这会导致问题。在我创建的控制器中:
def populate = {
def bookInstance = new Book()
def dir = 'C:/currentBooks.txt'
def bookList
bookList = readFile(dir) //read file and push values into bookList
int numOfBooks = bookList.size()
numOfBooks.times {
bookInstance.setBookAuthor(bookList.author[it])
bookInstance.setTitle(bookList.title[it])
bookInstance.setCurrentPage(bookList.title[it])
bookInstance.save()
}
}
我调用populate读取文件并用新书填充数据库。问题是我想用新值更新它。例如,假设该书已经存在于数据库中,但我已经阅读了本书,并希望更改 currentPage ,以便在文件中更改数据并调用populate但不会更新页面,因为标题已存在。
有人可以解释如何使用新值更新结果吗?
答案 0 :(得分:3)
首先,您需要一个Book域对象的密钥。您将标题标记为唯一,这表示您希望使用该标题来唯一标识图书。我建议不要(当两本书有相同的标题时会发生什么?)并默认使用id grails。这意味着除了您的其他字段外,您还必须将ID存储在currentBooks.txt
中。
获得id后,您可以尝试从数据库加载现有记录。如果没有,请创建一个新的。例如:
def dir = 'C:/currentBooks.txt'
def bookList
bookList = readFile(dir) //read file and push values into bookList
int numOfBooks = bookList.size()
numOfBooks.times {
def bookInstance.get(bookList.id[it])
if (!bookInstance) {
bookInstance = new Book()
}
bookInstance.setBookAuthor(bookList.author[it])
bookInstance.setTitle(bookList.title[it])
bookInstance.setCurrentPage(bookList.title[it])
bookInstance.save()
}
或者,您可以使用标题作为ID。如上所述,这是一个坏主意,但它可以节省跟踪单独的ID并更改currentBooks.txt
的格式。如下定义了Book,您可以调用Book.get(bookList.title[it])
:
class Book {
static belongsTo = Author
String toString() { title }
Author bookAuthor
String title
String currentPage
static constraints = {
bookAuthor()
title(unique:true)
currentPage()
}
static mapping = {
id name: 'title', generator: 'assigned'
}
}