Grails问题与unique / save / update有关

时间:2010-12-28 23:14:09

标签: grails groovy save unique

我遇到了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但不会更新页面,因为标题已存在。

有人可以解释如何使用新值更新结果吗?

1 个答案:

答案 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'
    }
}