dateCreated, lastUpdated поля в Grails 2.0

У меня есть приложение, которое использует Grails 1.3.7, которое я только что перешел на Grails 2.0. Приложение использует автоматический dateCreated а также lastUpdated поля для управления временными метками, связанными с созданием и модификацией объектов. После обновления я получаю следующую ошибку:

| Running Grails application
| Error 2012-01-29 22:36:53,504 [Thread-8] ERROR util.JDBCExceptionReporter  - ERROR: null value in column "date_created" violates not-null constraint
| Error 2012-01-29 22:36:53,510 [Thread-8] ERROR events.PatchedDefaultFlushEventListener  - Could not synchronize database state with session

Комментирование вышеупомянутых полей в моих классах доменов устраняет проблему.

Есть dateCreated а также lastUpdated поля были объявлены устаревшими в Grails 2.0? Если это так, значит ли это, что мне нужно написать код для обработки этой функциональности вручную или код был перенесен в какой-то плагин, такой как плагин Audit-Trail?

3 ответа

Решение

Хорошо, исправили это, вручную установив для переменной autoTimestamp значение "true" в определениях класса домена:

static mapping = {
        autoTimestamp true
}

Я предполагаю, что это свойство не устанавливается после переноса проекта с Grails 1.3.7 на 2.0.0.

Grails 2.0 по-прежнему поддерживает автоматические отметки времени. Это указано в руководстве (прокрутите немного вверх по этой ссылке).

Тем не менее, он конкретно упоминает:

Если вы положите nullable: false ограничения либо dateCreated или же lastUpdated, ваши экземпляры домена не пройдут проверку - вероятно, не то, что вы хотите. Оставьте ограничения на этих свойствах, если вы не отключили автоматическую отметку времени.

В Grails 2.0.3 есть ошибка, которая может вызвать эту проблему при использовании Postgres. См. http://jira.grails.org/browse/GRAILS-8988. Проблема говорит, что она будет решена, когда выйдет 2.0.4.

Я нашел альтернативное решение, если вы работаете в Grails 4:

class ScheduledTaskServiceSpec extends Specification implements ServiceUnitTest<ScheduledTaskService>{

    @Shared @AutoCleanup HibernateDatastore hibernateDatastore
    @Shared AutoTimestampEventListener timestamper

    void setupSpec() {
        hibernateDatastore = new HibernateDatastore(RegistrationCode)
        timestamper = hibernateDatastore.getAutoTimestampEventListener()
    }

    @Transactional
    @Rollback        
    void 'some test method'() {
        when:
        timestamper.withoutDateCreated(MyDomainClass) {
            MyDomainClass mdc = new MyDomainClass(name:"foo")
            mdc.dateCreated = new Date() - 20
        }

        then:
        MyDomainClass.findByName("foo").dateCreated < new Date()
    }
}

Ссылка

AutoTimestampEventListener

Другие вопросы по тегам