Версия Grails доменного класса по DateTime - PullRequest
0 голосов
/ 20 февраля 2011

Я бы хотел создать класс домена Grails DateTime таким образом, чтобы:

  • каждое первичное свойство ID + DateTime приводит к новой строке БД (т. Е. Новой строке БД для каждой версии)
  • новейшую версию можно найти без указания значения DateTime

Мои знания о Граале сейчас немного ограничены, и я не понимаю, как мне этого добиться.

Рассмотрим следующий класс домена в качестве примера:

import org.joda.time.DateTime

class Page {
    String pageId
    DateTime theVersion
    String content

    static constraints = {
        pageId(nullable:false, blank:false, unique:true, matches:"[a-zA-Z\\._-]+")
        content(nullable:false, blank:false)
    }

    static mapping = {
        content(type:"text")
    }
}


  • Какие изменения необходимы для обеспечения вставки новой строки БД для каждой версии?

    Я предполагаю, что требуется какая-то форма ограничения, такая, что pageId + theVersion уникален, но я не знаю как это выразить в GORM DSL.

  • Как получить самую последнюю версию, не зная соответствующего значения DateTime?

    Я предполагаю что-то вроде:
    Page.findByPageIdAndTheVersionLessThanEquals('uniquePageId', new DateTime())

    Я ожидаю, что это найдет много объектов, а не только один. Я хотел бы также иметь возможность выразить эквивалент ORDER BY theVersion DESC LIMIT 0,1

1 Ответ

3 голосов
/ 20 февраля 2011
  • Просто создайте новые версии с new Page(), а не с get() - будет вставлена ​​новая запись.

Чтобы обеспечить уникальность, наложите ограничения: theVersion(unique: 'pageId')

  • Page.findByPageId(pageId, [sort: 'theVersion', order: 'desc', max: 1])

  • Вы можете использовать неявную функцию отметки времени Grails dateCreated - , она будет работать даже с плагином joda-time .

  • OTOH, почему бы вам не использовать встроенное поле Grails version? Он предоставляет вам некоторые функции из коробки и обеспечивает оптимистическую блокировку.

...